我的一个类在它们的函数上有一个沉闷的重复模式,我想把这个模式变成一个装饰器。但问题是这个装饰器必须访问当前实例的一些属性,所以我想把它变成这个类中的方法。我遇到了一些问题。
所以,这与我想要的相似:
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
答案 0 :(得分:14)
装饰器只获得一个参数 - 它装饰的函数或方法。它没有作为self
参数传递实例 - 在调用decorator时,甚至没有创建类,更不用说类的实例了。该实例将作为第一个参数传递给装饰函数,因此您应该在self
的参数列表中包含call()
作为第一个参数。
我认为没有必要在类范围中包含装饰器。你可以这样做,但你也可以在模块范围内拥有它。