如果我将装饰器应用于类:
from flask.ext.restful import Resource
@my_decorator()
class Foo(Resource): ...
它是否会自动应用于任何子类方法?例如,它会神奇地应用于a_foobar_method
吗?
class FooBar(Foo):
def a_foobar_method(self):
...
答案 0 :(得分:3)
简而言之,没有。
@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):
...
真正的答案取决于装饰者的作用。原则上,如果在将类实例化为对象之后查看方法列表(例如,因为它修改了FooBar
方法),则有机会查看__init__
的方法。但是,如果它在调用时通过方法并对每个方法应用一些更改,那么它将对FooBar
中的额外方法(或替换方法)没有影响。
答案 1 :(得分:-1)
装饰者不会以任何方式“标记”装饰类。没有办法判断你是否写了
@decorator
class Foo:
pass
或
class Foo:
pass
Foo = decorator(Foo)
只需查看Foo
本身即可。装饰器只是在使用点应用,然后被遗忘。