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出现了

你可能感兴趣的:(py)