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

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)

Art*_*cca 6

简而言之,不。

@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


che*_*ner 1

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

@decorator
class Foo:
    pass
Run Code Online (Sandbox Code Playgroud)

或者

class Foo:
    pass

Foo = decorator(Foo)
Run Code Online (Sandbox Code Playgroud)

简单地通过观察Foo自身。装饰器只是在使用时应用,然后就被遗忘了。