Python中的子类是否可以继承父类装饰器

时间:2016-10-12 15:15:06

标签: python python-decorators

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

from flask.ext.restful import Resource

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

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

class FooBar(Foo):

    def a_foobar_method(self):
        ...

2 个答案:

答案 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本身即可。装饰器只是在使用点应用,然后被遗忘。