【问题标题】:Can subclasses in Python inherit parent class decoratorPython中的子类可以继承父类装饰器吗
【发布时间】:2017-02-21 11:17:17
【问题描述】:

如果我将装饰器应用于类:

from flask.ext.restful import Resource

@my_decorator()
class Foo(Resource): ...

它会自动应用于任何子类方法吗?例如,它会神奇地应用于a_foobar_method吗?

class FooBar(Foo):

    def a_foobar_method(self):
        ...

【问题讨论】:

  • 那个装饰器甚至没有应用于Foo的方法。
  • 何不试试看?

标签: python python-decorators


【解决方案1】:

简而言之,没有。

@my_decorator
class Foo(Resource): ...

只是简写

class Foo(Resource): ...
Foo = my_decorator(Foo)

如果您唯一一次使用Foo 是定义FooBar,那么您的两段代码加起来就相当于:

class Foo(Resource): ...
Foo_decorated = my_decorator(Foo)
class FooBar(Foo_decorated):
    def a_foobar_method(self):
        ...

甚至到这个:

class Foo(Resource): ...
class FooBar(my_decorator(Foo)):
    def a_foobar_method(self):
        ...

真正的答案取决于装饰者做了什么。原则上,如果在类被实例化为对象之后查看方法列表(例如,因为它修改了__init__ 方法),它就有机会看到FooBar 的方法。但是,如果它在调用它时遍历方法并对它们中的每一个应用一些更改,那么它将不会影响FooBar 中的额外方法(或替换方法)。

【讨论】:

    【解决方案2】:

    装饰器不会以任何方式“标记”被装饰的类。没有办法判断你是否写过

    @decorator
    class Foo:
        pass
    

    class Foo:
        pass
    
    Foo = decorator(Foo)
    

    只需查看Foo 本身。装饰器只是在使用时应用,然后就被遗忘了。

    【讨论】:

      猜你喜欢
      • 2015-06-18
      • 1970-01-01
      • 2011-03-23
      • 2019-11-27
      • 2019-12-07
      • 2018-05-06
      • 2021-02-21
      • 2021-02-12
      • 2018-02-08
      相关资源
      最近更新 更多