use*_*296 11 python python-decorators
如果我将装饰器应用于一个类:
from flask.ext.restful import Resource
@my_decorator()
class Foo(Resource): ...
Run Code Online (Sandbox Code Playgroud)
它也会自动应用于任何子类方法吗?例如,它会神奇地应用到吗a_foobar_method?
class FooBar(Foo):
def a_foobar_method(self):
...
Run Code Online (Sandbox Code Playgroud)
简而言之,不。
@my_decorator
class Foo(Resource): ...
Run Code Online (Sandbox Code Playgroud)
只是简写
class Foo(Resource): ...
Foo = my_decorator(Foo)
Run Code Online (Sandbox Code Playgroud)
如果您唯一使用的一次Foo是定义FooBar,那么您的两段代码加在一起相当于:
class Foo(Resource): ...
Foo_decorated = my_decorator(Foo)
class FooBar(Foo_decorated):
def a_foobar_method(self):
...
Run Code Online (Sandbox Code Playgroud)
或者甚至是这样:
class Foo(Resource): ...
class FooBar(my_decorator(Foo)):
def a_foobar_method(self):
...
Run Code Online (Sandbox Code Playgroud)
真正的答案取决于装饰者做什么。FooBar原则上,如果在类被实例化为对象之后查看方法列表,那么它就有机会看到方法(例如,因为它修改了__init__方法)。但是,如果它在调用时遍历这些方法并对每个方法进行一些更改,那么它将对 中的额外方法(或替换方法)没有影响FooBar。
装饰器不会以任何方式“标记”被装饰的类。无法判断你是否写过
@decorator
class Foo:
pass
Run Code Online (Sandbox Code Playgroud)
或者
class Foo:
pass
Foo = decorator(Foo)
Run Code Online (Sandbox Code Playgroud)
简单地通过观察Foo自身。装饰器只是在使用时应用,然后就被遗忘了。