装饰器是 Python 的一个重要部分,是修改其他函数的功能的函数

装饰器的本质是函数,它用于装饰其它的函数,就是为其它函数添加附加的功能。

他有以下几个原则:

不能修饰被装饰函数的源代码

不能修饰被装饰函数的调用方式

也就是说被装饰函数自身感觉不出装饰器一样,他原来怎样现在还怎么样,只不过是该方法的功能发生了改变,被增强了。

其实函数也是一个变量,定义一个函数就相当于把函数体赋值给方法名,变量名的引用指向函数体

函数的嵌套

就是一个函数1内部还定义一个函数2,函数2是作为函数1的局部函数存在的,作用域的范围是函数1

装饰器是 Python 的一个重要部分,是修改其他函数的功能的函数

fun2方法写在fun1的内部,所以只能在fun1内部调用fun2

因为函数的本质也是一个变量,所以在使用嵌套函数的时候,就把内部函数当作是一个局部变量对待,方法名就是变量名,局部变量可以当作返回值返回,所以方法也可以当作返回值返回,接收到的是整个函数,然后可以调用这个函数

装饰器是 Python 的一个重要部分,是修改其他函数的功能的函数

嵌套函数中返回方法名fun2被fun接收,fun()就相当于执行fun2方法,不要认为fun1方法执行之后fun1内部的东西就会被销毁,所以fun2没有了,因为fun2作为返回值赋值给了fun,所以fun指向一个一摸一样的fun2方法,就好像

def fun():

print(1)

设计一个装饰器

装饰器是 Python 的一个重要部分,是修改其他函数的功能的函数

这个就是一个装饰器的举例

高阶函数两个方式全用+嵌套函数=装饰器

该方法装饰了f方法,使得f方法增加了输出自己运行时间的功能,上面的格式是装饰器的标准格式

可以理解为外部方法为了获取要增强的方法的名字,内部方法对方法进行增强,内部方法就是我们所要的增强方法,然后内部方法名称,接收之后调用就是增强的方法了

这是装饰器的举例,但是还有一点不方便,就是我们需要f=out(f)将原来方法进行传递,并且接收增强的方法,我们可以通过异步操作将这个步骤省略,举例:

装饰器是 Python 的一个重要部分,是修改其他函数的功能的函数

在被装饰的方法上使用@外部函数名的方式,相当于f=out(f),之后我们想要调用增强方法,直接被增强方法()来实现

上面的方法还可以看出哪个方法想要被增强就在那个方法上放上@out就ok了

但是还有一个问题,当我们要增强的方法有参数的时候,会出问题。

装饰器是 Python 的一个重要部分,是修改其他函数的功能的函数

原因是f(1)此时相当于inner(1),但是内部inner方法并没有参数,所以会出问题,解决方法是inner填上对应的参数,内部fun填上对应的参数

装饰器是 Python 的一个重要部分,是修改其他函数的功能的函数

参数问题解决了,但是要是空参方法想要增强就会出问题,因为inner已经有了参数,所以应该使用可变参数,使得所有有参数,没参数,多个参数的方法都可以增强

装饰器是 Python 的一个重要部分,是修改其他函数的功能的函数

如果被增强的方法有返回值,那么如何使得inner将这个返回值返回呢?

方法就是inner方法的内部调用f被增强方法的时候,获取到这个返回值,然后再返回

装饰器是 Python 的一个重要部分,是修改其他函数的功能的函数


@out相当于f=out(f)

如果@out(name="huan feng")那么装饰器该如何写呢?

如果是这样的话,那么嵌套函数需要三层,第一层用于接收name=“huan feng”,第二层和第三层和原来一样

装饰器是 Python 的一个重要部分,是修改其他函数的功能的函数

这个程序执行的顺序是这样的当执行@outout(name=“huanfeng”)的时候,它会执行outout方法,并将huanfeng作为参数传递给它,然后执行outout方法,输出name huanfeng,然后往下执行return out,并不代表outout执行完成,它还会继续执行out方法,返回inner,所以@outout(name=“huanfeng”)可以简单的看成f=out(f)+将name=“huanfeng”传递给outout方法,f依然是被增强的方法,和以前一样