参考:
- 【【python】装饰器超详细教学,用尽毕生所学给你解释清楚,以后再也不迷茫了!-哔哩哔哩】
https://b23.tv/Y6Ss8cN
- 【Python小技巧:装饰器(Decorator)-哔哩哔哩】
https://b23.tv/hacMmem
x.1 Python中的Abstract Decorator抽象装饰器
python中任何东西都是object对象,而任何object都有一个CALL_FUNCTION,即当你使用1()其实会调用1CALL_FUNCTION。这个和类的实例化对象transform()不一样,他是调用__call__
这个magic method。常见的built-in function和magic method对应关系。
如__len__
是magic method,而len()
是built-in function。
所以function也可以作为输入传入
def double(x):return x * 2def triple(x):return x * 3def calc_number(func, x):print(func(x))calc_number(double, 3)
calc_number(triple, 3)
同样函数的返回值也可以是一个函数
def get_multiple_func(n):def multiple(x):return n * xreturn multipledouble = get_multiple_func(2) # <=> double = multiple, while double(3)=multiple(3)
triple = get_multiple_func(3)print(double(3))
print(triple(3))
一个极简的Abstract decorator如下,decorator本质上是一个输入输出都是函数的函数
# 一个极简的Abstract decorator如下,decorator是一个输入输出都是函数的函数:
def dec(f):pass@dec
def double(x):return x * 2# 等价于如下:
double = dec(double)
x.2 Python中的Base Decorator正常装饰器
一个正常的base decorator如下
# 一个正常的base decorator如下::如我们要完成计算时间的功能
import time
def display_time(func):def wrapper():t1 = time.time()func()t2 = time.time()print(t2 - t1)return wrapper@display_time
def count():count = 0for i in range(1000):count += 1count()
增加返回值功能
# 增加返回值功能
def display_time_return(func):def wrapper():t1 = time.time()result = func()t2 = time.time()print(t2 - t1)return resultreturn wrapper@display_time_return
def count_return():count = 0for i in range(1000):count += 1return countresult = count_return()
print(result)
增加返回值和传递参数功能
# 增加返回值和传递参数功能
def display_time_return_param(func):def wrapper(*args, **kwargs):t1 = time.time()result = func(*args, **kwargs)t2 = time.time()print(t2 - t1)return resultreturn wrapper@display_time_return_param
def count_return_param(count_num=10000):count = 0for i in range(count_num):count += 1return countresult = count_return_param(count_num=200000)
print(result)