python装饰方法,在Python中为每个实例装饰方法

Assume I have some simple class

class TestClass:

def doSomething(self):

print 'Did something'

I would like to decorate the doSomething method, for example to count the number of calls

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)

Now this counts the number of calls to the decorated method, however I would like to have per-instance counter, such that after

foo1=TestClass()

foo1.doSomething()

foo2=TestClass()

foo1.doSomething.count is 1 and foo2.doSomething.count is 0. From what I understand, this is not possible using decorators. Is there some way to achieve such behaviour?

解决方案

Utilize the fact that self (i.e. the object which the method is invoked on) is passed as a parameter to the method:

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

In above code, we intercept the object as obj parameter of the decorated version of method. Usage of the decorator is pretty straightforward:

class Foo(object):

@counted

def do_something(self): pass

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值