参考:
- 【【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 * 2
def triple(x):
return x * 3
def 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 * x
return multiple
double = 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 = 0
for i in range(1000):
count += 1
count()
增加返回值功能
# 增加返回值功能
def display_time_return(func):
def wrapper():
t1 = time.time()
result = func()
t2 = time.time()
print(t2 - t1)
return result
return wrapper
@display_time_return
def count_return():
count = 0
for i in range(1000):
count += 1
return count
result = 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 result
return wrapper
@display_time_return_param
def count_return_param(count_num=10000):
count = 0
for i in range(count_num):
count += 1
return count
result = count_return_param(count_num=200000)
print(result)