定义:
装饰器是嵌套函数的简短形式,通过装饰器可以修改函数的行为。
基础知识:
1.Python可嵌套定义函数
2.Python的函数名也是变量
3.Python的可变参数*args与**kargs
注意:虽然定义中装饰器是改变函数行为,但其实上其并不能改变函数行为,只能额外增加逻辑。接下来将会逐渐解析这一行为。
# 首先定义一个需要用来装饰的函数,此函数为功能函数
def add(a:int, b:int):
return a+b
# 再定义一个装饰器函数,用来装饰上面的功能函数 add
def decoration(methodName):
# 使用函数内可以定义函数的特性,定义一个包裹功能函数的函数
def wrapTheFunction(*args,**kwargs):
print("现在要开始计算了哦")
result = methodName(*args,**kwargs)
print("计算完毕")
return result
return wrapTheFunction
# 此时经过装饰的函数的使用方式变成这样
result = decoration(add)(3,5)
print(result)
# 打印结果如下
# 现在要开始计算了哦
# 计算完毕
# 8
也许有小伙伴现在是满脸问号,第一次见到连续使用两次括号的。没关系,我也才第二次(笑)。先别慌,本质上也只是在调用函数而已,将之拆成两步会很好理解。
# 首先得到执行函数。根据上方定义的函数,返回值其实是一个名为wrapTheFunction的函数。
func = decoration(add)
# 然后开始计算结果。wrapTheFunction中调用了我们定义的功能函数add,并且将参数传给了add
resulut = fun(3,5)
此时大概就已经豁然开朗了。但连续使用两次括号怎么看都会有点奇怪。于是我们来讲讲Python3提供的语法糖。
# 首先定义一个装饰器函数
def decoration(methodName):
# 使用函数内可以定义函数的特性,定义一个包裹功能函数的函数
def wrapTheFunction(*args,**kwargs):
print("现在要开始计算了哦")
result = methodName(*args,**kwargs)
print("计算完毕")
return result
return wrapTheFunction
# 然后在定义功能函数的时候如此使用
@ decoration
def add(a:int, b:int):
return a+b
# 此时经过装饰的函数的使用方式变成这样
result = add(3,5)
print(result)
# 打印结果如下
# 现在要开始计算了哦
# 计算完毕
# 8
这里我们会发现两个细节:1.函数只需要调用一次了 2.函数名变成了函数本身
这就是Python3的语法带来的便捷性,如果我们要实现相同的功能,代码需要这样写。
# 导入一个Python3官方提供的装饰器 wraps
from functools import wraps
# 首先定义一个需要用来装饰的函数,此函数为功能函数
def add(a:int, b:int):
return a+b
# 再定义一个装饰器函数,用来装饰上面的功能函数 add
def decoration(methodName):
# 使用 wraps 装饰器将 wrapTheFunction 信息修改成传入函数的信息
@ wraps(methodName)
def wrapTheFunction(*args,**kwargs):
print("现在要开始计算了哦")
result = methodName(*args,**kwargs)
print("计算完毕")
return result
return wrapTheFunction
# 使用 add 变量存储返回的函数 wrapTheFunction,伪装成 add 函数本身
add = decoration(add)
# 再将参数传入伪装后的 add 函数得到结果
result = add(3,5)
print(result)
# 打印结果如下
# 现在要开始计算了哦
# 计算完毕
# 8
Python3 的语法糖帮助我们做的就是如此。