简单的说,装饰器就是 函数的函数。
正常来说,我们定义一个函数的函数通常是这样的:
# 定义一个函数的函数
def Func4func(func):
def printf(input): # 由于Func4func的return是这个printf,所以之后被装饰后的func的输入参数是 input。
return func() + ' in Func4func'+' with [input]:\t' + input
return printf
# 定义一个函数
def func():
meg = 'i am a function'
print(meg)
return meg
# 用Func4func来装饰func,注意是传入函数func而不是函数运行后结果func()
decorated_func = Func4func(func)
# 装饰后的函数实际上是printf(input)
print(decorated_func('haha')) # 'haha'实际上是 Func4func中的 printf()的input。
输出结果:
i am a function
i am a function in Func4func with [input]: haha
装饰器使用 @
标识符可以把上面的调用简化,简化后就变成了这样:
# 定义一个函数的函数
def Func4func(func):
def printf(input): # 由于Func4func的return是这个printf,所以之后被装饰后的func的输入参数是 input。
return func() + ' in Func4func'+' with [input]:\t' + input
return printf
# 用Func4func来装饰func
@Func4func
def func(): # 定义一个函数
meg = 'i am a function'
print(meg)
return meg
# func在被Func4func装饰之后,实际上等价于上面的decorated_func,所以现在的func实际上是Func4func(func),因此需要传入input参数。
print(func('haha')) # 'haha'实际上是 Func4func中的 printf()的input。
输出结果:
i am a function
i am a function in Func4func with [input]: haha
更进一步,装饰器函数(函数的函数)也可以定义它的参数:
# 定义一个函数的函数,这个函数带参数。
def Func4func_wi_parameter(para): # 在原来的Func4func外面再嵌套一层Func4func_wi_parameter(para),其中para就是参数。
def Func4func(func):
def printf(input): # 由于Func4func的return是这个printf,所以之后被装饰后的func的输入参数是 input。
return func() + ' in Func4func'+' with [input]:\t' + input + ' and [Para]:\t'+para
return printf
return Func4func # 返回函数Func4func而不是函数运行后的结果Func4func()
# Func4func_wi_parameter(para)传入参数后,返回值是Func4func,所以实际上还是用Func4func来装饰func
@Func4func_wi_parameter('parameter666666')
def func(): # 定义一个函数
meg = 'i am a function'
print(meg)
return meg
print(func('haha')) # 'haha'实际上是 Func4func中的 printf()的input。
输出结果:
i am a function
i am a function in Func4func with [input]: haha and [Para]: parameter666666
如果func
是带参数的,也可以通过下面方法输入参数:
# 定义一个函数的函数,这个函数带参数。
def Func4func_wi_parameter(para): # 在原来的Func4func外面再嵌套一层Func4func_wi_parameter(para),其中para就是参数。
def Func4func(func):
def printf(meg:str, input:str): # 由于Func4func的return是这个printf,所以之后被装饰后的func的输入参数是 input。
return func(meg) + ' in Func4func'+' with [input]:\t' + input + ' and [Para]:\t'+para
return printf
return Func4func # 返回函数Func4func而不是函数运行后的结果Func4func()
# Func4func_wi_parameter(para)传入参数后,返回值是Func4func,所以实际上还是用Func4func来装饰func
@Func4func_wi_parameter('parameter666666')
def func(meg:str='???'): # 定义一个函数
print(meg)
return meg
print(func('i am a func','haha')) # 'haha'实际上是 Func4func中的 printf()的input。
输出结果:
i am a function
i am a function in Func4func with [input]: haha and [Para]: parameter666666