【问题标题】: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):
...
【问题讨论】:
标签:
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 本身。装饰器只是在使用时应用,然后就被遗忘了。