python类装饰器

之前写了一片函数装饰器,类装饰器的调用过程与函数装饰器相似

简单版本的类装饰器, 用类来装饰一个函数:

#用类来装饰一个函数
class Tracer():
    def __init__(self,func):        #接受一个函数对象
        self.calls = 0              #跟踪函数调用的次数
        self.func = func
        print(Tracer.__init__.__name__ , func)
    def __call__(self, *args, **kwargs):
        self.calls += 1              #每一次调用加1
        print('call %s to %s'%(self.calls, self.func.__name__))
        self.func(*args, **kwargs)   #调用原函数
@Tracer
def some_func(a,b,c):        #转换过程-> some_func = Tracer(some_func) ,自此some_func不再是函数,而是一个Tracer对象
    print(a,b,c)
some_func(1,2,3)             #调用了__call__, some_func已经是Tracer实例,相当于Tracer()()
print(some_func)             #可以看到some_func 已经是一个Tracer对象而不是函数

简单版本的函数装饰器,用函数来装饰一个类

#用函数来装饰一个类
def add_counter_to_class(some_cls): #参数是一个类对象
    print('Class:%s'%some_cls.__name__)
    some_cls.counter = 0            #给类添加一个类属性(相当于C++中的静态成员变量)
    return some_cls                 #返回类对象自身

@add_counter_to_class               #SomeClass = add_counter_to_class(SomeClass)
class SomeClass:
    pass

print(SomeClass.counter)            #可以看到counter出现了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值