参考文档:
https://www.cnblogs.com/gdjlc/p/11182441.html
情况1
def log(func):
def wrapper():
print('log开始 ...')
func()
print('log结束 ...')
return wrapper
def log_abc(func):
def wrapper():
print('log开始 abc...')
func()
print('log结束 abc...')
return wrapper
@log_abc
@log
def test():
print('test ..')
if __name__ == "__main__":
test()
运行结果:
C:\Python37\python.exe E:/python/work/python3_test/flag_test.py
log开始 abc...
log开始 ...
test ..
log结束 ...
log结束 abc...
Process finished with exit code 0
情况2
其他资料参考
Python修饰器的函数式编程
http://www.open-open.com/lib/view/open1395285030019.html
Python进阶
http://www.wklken.me/category/pythonru-men-ji-jin-jie-bi-ji.html
Python装饰器学习(九步入门)
http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html
Python深入05 装饰器
http://www.cnblogs.com/vamei/archive/2013/02/16/2820212.html
Python functools.wraps装饰器模块
嵌套修饰符
情况3
from functools import wraps
a = 0
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
'''decorator'''
print('Calling decorated function...')
return func(*args, **kwargs)
return wrapper
def my_log(func):
@wraps(func)
def wrapper(*args, **kwargs):
'''decorator'''
print('Calling my_log function...')
return func(*args, **kwargs)
return wrapper
@my_log
@my_decorator
def example():
"""Docstring"""
global a
print('Called example function')
a = a +1
print(a)
return a
if __name__ == "__main__":
print(example.__name__, example.__doc__)
b = example()
print('b=', b)
b = example()
print('b=', b)
运行结果
C:\Python37\python.exe E:/python/work/python3_test/flag_test.py
example Docstring
Calling my_log function...
Calling decorated function...
Called example function
1
b= 1
Calling my_log function...
Calling decorated function...
Called example function
2
b= 2
Process finished with exit code 0