问题描述
|
假设我有一些简单的课程
class TestClass:
def doSomething(self):
print \'Did something\'
我想装饰doSomething
方法,例如计算通话次数
class SimpleDecorator(object):
def __init__(self,func):
self.func=func
self.count=0
def __get__(self,obj,objtype=None):
return MethodType(self,objtype)
def __call__(self,*args,**kwargs):
self.count+=1
return self.func(*args,**kwargs)
现在,这计算了对装饰方法的调用次数,但是我希望每个实例都有一个计数器,这样
foo1=TestClass()
foo1.doSomething()
foo2=TestClass()
foo1.doSomething.count
是1,foo2.doSomething.count
是0。据我了解,使用装饰器是不可能的。有什么方法可以实现这种行为?
解决方法
利用事实,将“ 6”(即调用该方法的对象)作为参数传递给该方法:
import functools
def counted(method):
@functools.wraps(method)
def wrapped(obj,*args,**kwargs):
if hasattr(obj,\'count\'):
obj.count += 1
else:
obj.count = 1
return method(obj,**kwargs)
return wrapped
在上面的代码中,我们将对象作为方法的修饰版本的obj
参数拦截。装饰器的用法非常简单:
class Foo(object):
@counted
def do_something(self): pass
, ѭ10的第一个元素不是要在其上调用方法的对象吗?您不能只将计数存储在那里吗?