【发布时间】:2016-10-14 00:28:39
【问题描述】:
我想用装饰器做一些准备工作并记录函数的状态,所以我写了这样的东西:
class Decorator:
def __init__(self, func):
self.count = 0
self.func = func
def __call__(self, *args, **kwargs):
self.count += 1 # Simply count the call times
return self.func(self, *args, **kwargs)
class Foo:
def __init__(self):
self.value = 0
@Decorator
def test(self, value):
self.value = value # change the value of instance
print(self.value)
f = Foo()
f.test(1)
print(f.value)
print(f.test.value)
但很明显__call__(self, *args, **kwargs)中的self对应的是Decorator的实例,而不是Foo的实例,这会使f.value不变,但f.test.value增加。
有什么方法可以将Foo 的实例传递给Decorator 而不是Decorator 本身?
或者有什么方法可以更清楚地实现这个功能?
非常感谢。
【问题讨论】:
-
f.test.value 是做什么的?
-
我 200% 确定我没有完全理解您的问题。就像在您的代码中一样,您想记录一个带有 @Decorator 的方法被调用了多少次。这很好,但稍后您将如何访问该 count。我尝试了一个示例,您可以将 Foo 的实例传递给 Decorator,但 f.test.value 不起作用
-
您可以使用
f.test.count访问计数,其中f是Foo的一个实例。