二十一、深入Python强大的装饰器( 二 )

类装饰器类装饰器主要依赖函数__call__, 因此我们主要重写__call__即可 。
每当调用一个类的实例 , 函数__call__就会执行一次 。
下面 , 我们来看一个例子 。
class Count:def __init__(self, func):self.func = funcself.num_calls = 0def __call__(self, *args, **kwargs):self.num_calls += 1print('num of calls is: {}'.format(self.num_calls))return self.func(*args, **kwargs)@Countdef example():print("hello world")example()# 输出num of calls is: 1hello worldexample()# 输出num of calls is: 2hello world嵌套装饰器我们可以把多个装饰器叠加在同一个函数上 , 这个就叫做嵌套装饰 。
嵌套装饰器的顺序是从下到上 ,
【二十一、深入Python强大的装饰器】@f2@f1def greet(name):print(f"Hello {name}")所以上面的例子就是等价于:greet = f2(f1(greet))
那么相当于 , 从里到外 。
import functoolsdef my_decorator1(func):@functools.wraps(func)def wrapper(*args, **kwargs):print('execute decorator1')func(*args, **kwargs)return wrapperdef my_decorator2(func):@functools.wraps(func)def wrapper(*args, **kwargs):print('execute decorator2')func(*args, **kwargs)return wrapper@my_decorator1@my_decorator2def greet(message):print(message)greet('hello world')#相当于my_decorator1(my_decorator2(greet('hello world')))# 输出execute decorator1execute decorator2hello world看完这篇文章还不理解装饰器 , 只有一种可能 , 说明我写的还不够清晰 , 那点赞鼓励鼓励我吧 。
今天也学到了很多东西呢 , 明天有什么新知识呢?真期待鸭~如果喜欢文章可以关注我哦~
?
本文已收录 GitHub , 传送门~[1], 里面更有大厂面试完整考点 , 欢迎 Star 。
?
Reference[1]
传送门~: