首先要知道“@”这个符号-装饰器,就是个语法糖,主要的作用就是“安全”。使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
就是装饰器的作用,首先介绍下装饰器:
装饰器就是,假如已经有了一个函数func(a,b),作用是返回a-b,但是现在要让它返回a-b的绝对值,就要增加一个功能,如果不使用“@”这个符号的作用的话应该如下这么写:
def decorate(func):
def inner(a, b):
ret = func(a, b):
return abs(ret)
return inner
def sub(a, b):
return a-b
>>>sub(3, 4)
>>> -1
>>>sub = decorate(sub)
>>>sub(3, 4)
>>> 1
看上面那个例子所示,这样的话就要重新创建一个新的函数来包含sub这个函数的功能,如果这样的函数一多(即需要增加功能的函数很多),那么会大大影响机器的功效,和代码的美观。
但是如果使用“@”符号的话,那么代码如下:
def decorate(func):
def inner(a, b):
ret = func(a, b):
return abs(ret)
return inner
@decorate
def sub(a, b):
return a-b
>>>sub(3, 4)
>>>1
如上面的结果所示现在调用的是sub函数而不是上个例子的调用decorate函数。
而且装饰器能同时添加多个功能(比如说多个函数需要添加不同的模块,这个时候就需要将某个功能分到不同的函数中),就不用上面的例子了因为多个装饰器就涉及到了执行顺序的问题,具体如下:
总代码如上,因为屏幕问题不能一下子都输出来,结果如下:
有没有发现这个顺序是非常有趣的,多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身。
装饰器的外函数和内函数之间的语句是没有装饰到目标函数上的,而是在装载装饰器时的附加操作。
23~25行是装载装饰器的过程,相当于执行了test=dect1(dect2(test)),此时先执行dect2(test),结果是输出aaaa、将func指向函数test、并返回函数two,然后执行dect1(two),结果是输出1111、将func指向函数two、并返回函数one,然后进行赋值。
原文:https://www.cnblogs.com/hehehe-wy7/p/14032894.html