作为装饰器的类方法

时间:2014-01-27 14:00:11

标签: python decorator python-decorators

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

@self.action
def execute(self,req):    

其中action是我班级中的其他方法。但它不起作用并抛出异常

name 'self' is not defined

2 个答案:

答案 0 :(得分:7)

在定义类时,不能使用类的方法;在课堂上没有self,也没有“烘焙”的课程甚至可以访问任何课程。

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

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

    @action
    def execute(self, req):
        # something

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

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

class Derived(Base):
    @Base.action
    def execute(self, req):
        # something

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

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

答案 1 :(得分:0)

在python中,“self”作为参数传递给实例方法(第一个),“self”只是一个约定可以称之为“foobarbaz”(当然它会很愚蠢)......重点是,从外部“self”没有定义(因为它的范围是方法)...你不能用其他类方法来装饰类方法,而是你必须编写一个单独的类!