作为装饰器的类方法

gli*_*81g 2 python decorator python-decorators

我有一个班级,我有多种方法.我想使用其中一个方法作为其他方法的装饰器.为此,我使用以下语法:

@self.action
def execute(self,req):    
Run Code Online (Sandbox Code Playgroud)

动作是我班上的其他方法.但它不起作用并抛出异常

name 'self' is not defined
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 7

在定义类时,不能使用类的方法 ; 没有self内部类也不是"烤"甚至还没有访问任何类的类.

您可以将方法视为用作装饰器的函数:

class SomeClass():
    def action(func):
        # decorate
        return wrapper

    @action
    def execute(self, req):
        # something
Run Code Online (Sandbox Code Playgroud)

如果action在基类上定义,那么您必须通过基类引用该名称:

class Base():
    @staticmethod
    def action(func):
        # decorate
        return wrapper

class Derived(Base):
    @Base.action
    def execute(self, req):
        # something
Run Code Online (Sandbox Code Playgroud)

对于Python 2,你必须在action这里创建一个静态方法,否则你会得到一个未绑定的方法,如果没有实例作为第一个参数,你会抱怨你无法调用它.在Python 3中,您可以将@staticmethod装饰器留在那里,至少是为了装饰器的目的.

但请注意,action不能直接用作方法; 也许它不应该是那个阶段的一部分.它不是最终用户API的一部分,可能是这些类的实例的消费者不使用装饰器.