只要实现此
obj(func)()
模式,这个obj就叫一个装饰器——————————>参考https://cloud.tencent.com/developer/article/1114856
https://www.cnblogs.com/lianyingteng/p/7743876.html
函数装饰器
例子
---
def decorator(func):
def inner(*args, **kwargs):
print('before...........')
res = func(*args, **kwargs)
print('after............')
return res
return inner
@decorator
def run():
print('run...............')
return 0
if __name__ == "__main__":
run()
run.__name__
# 此时decorator叫做装饰器
------------------------------------------
before...........
run...............
after............
inner
注意:inner的返回值要与func的一致,并且inner与func参数相同
为了不改变被装饰函数或类的性质,添加functools.wrap装饰器
from functools import wraps
def decorator(func):
@wraps(func)
def inner():
print('before...........')
res = func()
print('after............')
return res
return inner
@decorator
def run():
print('run...............')
return 0
if __name__ == "__main__":
run()
print(run.__name__)
------------------------------------------
before...........
run...............
after............
run
带参数的装饰器(3层)
from functools import wraps
from datetime import datetime
def start():
return datetime.now()
def end():
return datetime.now()
def Filter(start_time, end_time):
def decorator(func):
@wraps(func)
def inner(*args, **kwargs):
s = start_time()
res = func(*args,**kwargs)
e = end_time()
print("耗时{}".format((e-s).total_seconds()))
return res
return inner
return decorator
@Filter(start, end)
def run():
for i in range(10000):
for j in range(100):
print(j)
return 0
if __name__ == "__main__":
run()
变种(截取自flask @route())
类装饰器
class decorator(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print('before............')
res = self.func(*args, **kwargs)
print('after............')
return res
@decorator
def run():
print('run............')
if __name__ == "__main__":
run()
-----------------------------------
before............
run............
after............