一、函数装饰器
在python中函数装饰器就是使用一个函数,用@这个函数 再接一个被装饰函数的用法:
#funA 作为装饰器函数
def funA(fn):
#...
fn() # 执行传入的fn参数
#...
return '...'
@funA
def funB():
#...
以上等价于:
1. def funA(fn):
2. #...
3. fn() # 执行传入的fn参数
4. #...
5. return '...'
6.
7. def funB():
8. #...
9.
10. funB = funA(funB)
因此,使用函数装饰器 funA() 去装饰另一个函数 funB(),其底层执行了如下 2 步操作:
1. 将funB 作为参数传给 funA() 函数;
2. 将funA()函数执行完成的返回值反馈回funB,此时函数名funB已不是原来的funB(),而是经过funA()装饰函数的返回值(funB = funA(funB)),返回值可能是普通变量也可能是函数,从而funB可能是普通变量也可能是函数。
举一个实例:
def funA(fn):
print("C语言中文网")
fn()
print("http://ttt.net")
return "装饰器函数的返回值"
@funA
def funB():
print("学习python")
程序执行结果为:
C语言中文网
学习 Python
http://c.ttt.net
如果在程序末尾添加语句:
print(funB)
则返回结果增加输出:
装饰器函数的返回值
被“@函数”修饰的函数不再是原来的函数,而是被替换成一个新的类型(取决于装饰器的返回值),即如果装饰器函数的返回值为普通变量,那么被修饰的函数名就变成了变量名;同样,如果装饰器返回的是一个函数的名称,那么被修饰的函数名依然表示一个函数。
所谓函数装饰器,就是通过装饰器函数,在不修改原函数的前提下,来对函数的功能进行合理的扩充,即通过funA 对 funB函数进行了功能扩充。