1、一个简单的引子
装饰器在执行test1()函数之前,先执行set_func()函数
def set_func(func):
def call_func():
print('___验证1___')
print('___验证2___')
func()
return call_func
@set_func
def test1():
print('___test____')
test1()
# 输出
___验证1___
___验证2___
___test____
2、装饰器的实现过程
def set_func(func):
def call_func():
print('___验证1___')
print('___验证2___')
func()
return call_func
def test1():
print('___test____')
ret = set_func(test1) # func指向的是test1()函数
ret()
# 输出
___验证1___
___验证2___
___test____
def set_func(func):
def call_func():
print('___验证1___')
print('___验证2___')
func()
return call_func
def test1():
print('___test____')
test1 = set_func(test1) # func指向的是test1()函数
test1()
# 输出
___验证1___
___验证2___
___test____
def set_func(func):
def call_func():
print('___验证1___')
print('___验证2___')
func()
return call_func
@set_func # 等价于test1 = set_func(test1)
def test1():
print('___test____')
test1()
# 输出
___验证1___
___验证2___
___test____
3、利用装饰器计算函数运行时间
from time import time
def set_func(func):
def call_func():
print('*********start*******')
start = time()
func()
stop = time()
print('********stop********')
print('time: ', stop - start)
return call_func
@set_func
def test1():
print('*******processing*********')
for i in range(1000):
pass
test1()
# 输出
*********start*******
*******processing*********
********stop********
time: 2.288818359375e-05
4、无返回值,有参数
def set_func(func):
def call_func(x, y):
print('-----!!!!!!-----')
func(x, y)
return call_func
@set_func
def test1(a, b):
print('c = a + b: ', a + b)
test1(100, 90)
# 输出
-----!!!!!!-----
c = a + b: 190
5、不定长参数
def test(num, *args, **kwargs):
print('------test-----', num)
print('------test-----', args)
print('------test-----', kwargs)
test(19)
test(19, 10)
test(19, 10, mm=23)
# 输出
------test----- 19
------test----- ()
------test----- {}
------test----- 19
------test----- (10,)
------test----- {}
------test----- 19
------test----- (10,)
------test----- {'mm': 23}
def set_func(func):
def call_func(*args, **kwargs):
print('-----!!!!!!-----')
# func(args, kwargs) 不行,相当于传递两个参数一个元组,一个字典
func(*args, **kwargs) # 拆包
return call_func
@set_func
def test(num, *args, **kwargs):
print('------test-----', num)
print('------test-----', args)
print('------test-----', kwargs)
test(19)
test(19, 10)
test(19, 10, mm=23)
# 输出
-----!!!!!!-----
------test----- 19
------test----- ()
------test----- {}
-----!!!!!!-----
------test----- 19
------test----- (10,)
------test----- {}
-----!!!!!!-----
------test----- 19
------test----- (10,)
------test----- {'mm': 23}
6、返回值
def set_func(func):
def call_func(*args, **kwargs):
print('-----!!!!!!-----')
return func(*args, **kwargs)
return call_func
@set_func
def test(num, *args, **kwargs):
print('------test-----', num)
print('------test-----', args)
print('------test-----', kwargs)
return 'ok'
print(test(19))
# 输出
-----!!!!!!-----
------test----- 19
------test----- ()
------test----- {}
-----!!!!!!-----
------test----- 19
------test----- (10,)
------test----- {}
-----!!!!!!-----
------test----- 19
------test----- (10,)
------test----- {'mm': 23}
7、类装饰器
class Test:
def __init__(self, func):
self.func = func
def __call__(self):
print('装饰器')
return self.func()
@Test # 相当于get_str = Test(get_str)
def get_str():
return 'haha'
print(get_str())
# 输出
装饰器
haha