【发布时间】:2012-07-29 06:00:00
【问题描述】:
我有一个类在他们的函数上有一个乏味的重复模式,我想把这个模式变成一个装饰器。但问题是这个装饰器必须访问当前实例的一些属性,所以我想把它变成这个类中的一个方法。我有一些问题。
所以,这与我想要的相似:
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以外的不同 实例传递给mydecorator,因为它装饰了somemethod? -
糟糕。从 vim 复制并粘贴到浏览器有时会很痛苦......
-
虽然不访问实例,但使用可调用类作为装饰器可以在调用之间将状态保存在类中。这不会回答这个问题,但可能会导致某人出于其他目的遇到此问题。