python – 一个方法可以是同一个类的另一种方法的装饰器吗?

我有一个类在他们的功能上有一个沉闷的重复模式,我想把这个模式变成一个装饰器.但是事情是这个装饰器必须访问当前实例的一些属性,所以我想把它变成这个类中的一个方法.我有一些问题.

所以,这跟我想要的类似:

class DullRepetitiveClass:
    def __init__(self, nicevariable):
        self.nicevariable = nicevariable

    def mydecorator(self, myfunction):
        def call(*args, **kwargs):
            print "Hi! The value of nicevariable is %s"%(self.nicevariable,)
            return myfunction(*args, **kwargs)
        return call

    @mydecorator            #Here, comment (1) below.
    def somemethod(self, x):
        return x + 1

(1)这是问题.我想使用DullRepetitiveClass.mydecorator方法来装饰somemethod方法.但是我不知道如何使用当前实例的方法作为装饰器.

有没有一个这样做的简单方法?

编辑:好的,答案很明显.正如Sven把它放在下面,装饰器本身就是转换方法.该方法本身应该处理与实例有关的一切:

def mydecorator(method):
    def call(self, *args, **kwargs):
        print "Hi! The value of nicevariable is %s"%(self.nicevariable,)
        return method(self, *args, **kwargs)
    return call


class DullRepetitiveClass:
    def __init__(self, nicevariable):
        self.nicevariable = nicevariable

    @mydecorator            
    def somemethod(self, x):
        return x + 1
最佳答案
装饰器只得到一个参数 – 它装饰的函数或方法.它不会被传递一个实例作为自我参数 – 在调用装饰器的时候,甚至没有创建类,更不用说类的一个实例.该实例将作为第一个参数传递给装饰函数,因此您应该将self作为第一个参数包含在call()的参数列表中.

我没有看到将装饰器包含在课程范围内的必要性.你可以做到这一点,但你也可以在模块范围内.

转载注明原文:python – 一个方法可以是同一个类的另一种方法的装饰器吗? - 代码日志