申明:资料来源于网络及书本,通过理解、实践、整理成学习笔记。
def funA(desA):
desA()
print("我是函数:funA() ,我装饰我上面的函数:" + desA.__name__)
@funA
def fun():
print("我是函数:fun()")
运行结果:
我是函数:fun()
我是函数:funA() ,我装饰我上面的函数:fun
@的作用
“定义”并“执行”funA()函数并将fun()函数作为参数传递给funA(),即: funA(fun())
装饰器的意义与作用
- 装饰器的作用就是为已经存在的对象添加额外的功能,
- 以原生的方式运行对象。在这是就是运行fun()但实际上运行的是 funA(fun())
为什么:自己开发的应用在线上稳定运行了一年,后面随着业务的发展发现原有的通过某些函数定义的部分功能需要扩展一下新功能,恰好现有的功能又作为公共接口在很多地方被调用。把新功能封装成可接收函数作为参数、同时调用原函数的高阶函数,然后通过嵌套函数来调用返回高阶函数这就需要用到今天的主角装饰器了。
原生的运行一下fun()
注意:如果原生的运行语句在,上面那个“@”就只有“定义”而没有“执行”功能了
def funA(desA):
desA()
print("我是函数:funA() ,我装饰我上面的函数:" + desA.__name__)
@funA
def fun():
print("我是函数:fun()")
fun()
运行结果:
我是函数:fun()
我是函数:funA() ,我装饰我上面的函数:fun
Traceback (most recent call last):
.
.
.
TypeError: 'NoneType' object is not callable
改改再来
def funA(desA):
desA()
print("我是函数:funA() ,我装饰我上面的函数:" + desA.__name__)
return funA
@funA
def fun():
print("我是函数:fun()")
return fun
fun()
运行结果:
我是函数:fun()
Traceback (most recent call last):
.
.
.
NameError: name 'fun' is not