前言
装饰器的作用主要是在不影响函数逻辑的情况下,扩展其某个常用功能,常用于为函数添加事件记录。
例如当需要给创建的所有函数在调用时都添加日志功能,就可以统一使用装饰器功能来方便的进行日志记录,同时当需求更改时很方便的进行统一更改,请查看如下示例:
装饰器三种用法包括:不带参数的装饰器、带参数的装饰器、创建装饰器类
# -------------------------------------------------------------------------------------------------
# 不带参数的装饰器示例
# -------------------------------------------------------------------------------------------------
# """
def logAction(fun1):
'''Function log docorator'''
def wrapFunction():
print('the function {} is called'.format(fun1.__name__))
fun1()
print('Function compeleted')
return wrapFunction
@logAction # 1、注意:此处@符号后面直接写的logAction后面并不带参数,所以程序在此处并未执行log action,而是返回logAction到MyFun1
def MyFun1(): # 2、程序运行到此处时实际是执行的logAction()函数,返回WrapFunction
print('Hi')
@logAction
def Myfun2():
print('Hello world')
# 打印MyFun1的名称,输出结果显示其名称其实已经被WrapFunction代替了,但是在装饰器里的Fun1名称显示的是调用的函数名称
print(MyFun1.__name__)
print(logAction.__doc__)
MyFun1() # 3、程序在此处执行的为wrapFunction()函数
Myfun2()
# """
# -------------------------------------------------------------------------------------------------
# 带参数的装饰器示例(装饰器带参数,调用函数带参数)
# -------------------------------------------------------------------------------------------------
# """
def logAction(LogDate=2022):
'''Function log docorator'''
def logdecorator(func):
def wrapFunction(*args, **kwargs):
print('{}:the function {} is called'.format(LogDate, func.__name__))
func(*args, **kwargs)
print('Function compeleted')
# return func
return wrapFunction
return logdecorator
@logAction(20220711) # 1、注意:此处的参数及括号是根据装饰器的嵌套层数来决定的,当程序运行到此处时直接运行logAction()返回logdecorator
def MyFun3(username='Mary'): # 2、程序运行到此处时将执行logdecorator()函数,返回wrapFunction
print('Hi' + username)
@logAction(20220712)
def Myfun4(username='Tom'):
print('Hello' + username)
MyFun3('Joke') # 3、在此处运行MyFun3实际上是运行的WrapFunction()
Myfun4('pitt')
# """
# -------------------------------------------------------------------------------------------------
# 装饰器类
# -------------------------------------------------------------------------------------------------
# """
class logger():
def __init__(self, logdate=20220712):
self.logDate = logdate
def __call__(self, func):
def wrapFunction(*args, **kwargs):
print('{}:the function {} is called'.format(self.logDate, func.__name__))
func(*args, **kwargs)
print('Function compeleted')
# return func
return wrapFunction
@logger(20220713) # 1、注意:程序运行到此处时将创建logger实例并执行初始化
def MyFun3(username='Mary'): # 2、程序运行到此处时将执行__call__函数,同时返回wrapFunction
print('Hi' + username)
@logger(20220713)
def Myfun4(username='Tom'):
print('Hello' + username)
MyFun3('Joke') # 3、在此处执行MyFun3时实际执行的是wrapFunction()函数
Myfun4('pitt')
# """
总结
1、装饰器主要起函数简化及扩展辅助功能,在某种情况下可以函数的补充
2、注意装饰器的用法格式及创建装饰器类需要的魔法方法
3、利用python编辑器调试断点功能可以查看装饰器执行时如何跳转的语句及执行步骤