gpt4 book ai didi

python - 在 Python 中装饰每个实例的方法

转载 作者:太空狗 更新时间:2023-10-30 00:37:16 25 4
gpt4 key购买 nike

假设我有一些简单的类

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,obj,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。据我所知,使用装饰器是不可能的。有什么方法可以实现这种行为吗?

最佳答案

利用 self(即调用方法的对象)作为参数传递给方法的事实:

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, *args, **kwargs)
return wrapped

在上面的代码中,我们截取对象作为装饰版本方法的obj参数。装饰器的使用非常简单:

class Foo(object):
@counted
def do_something(self): pass

关于python - 在 Python 中装饰每个实例的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6356858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com