作用:在不改变原来对象的情况下给不同函数或类插入相同的功能。
理解装饰器必须先知道闭包和内嵌函数。
一、内嵌函数
在一个函数中定义了另外一个函数。这里不进行过多说明。
二、闭包
将组成函数的语句和这些语句的执行的环境打包到一起得到的对象。
如果调用函数A,这个函数A返回一个函数B。这个被返回的函数就叫闭包。在调用A的时候,传的参数叫做自由变量。当内嵌函数使用自由变量的时候,当外层函数被使用结束,自由变量仍然存在(因为闭包在使用,不会被收回)。
例子:
funy则为闭包,x为自由变量。
python是面向对象的语言,一切物体皆为对象,包括函数和类,所以可以当做返回值返回或者当做参数调用。
三:装饰器
实现方法:定义装饰器格式与普通函数相同,只是参数必须有函数或者类,在装饰器函数内部嵌套一个函数或者类,并在执行该函某些功能前后或者中间使用参数函数。最后返回嵌套函数(闭包)。
构造:在需要被修饰的函数或者类前放“@装饰器名”
装饰器和闭包的关系:装饰器就是闭包的应用,只是装饰器传递的参数是函数或者类。
例子:
执行效果:
func是需要被装饰的函数,做为参数传到deco装饰函数中,并在嵌套函数_deco调用。函数传出一个闭包替代需要被修饰的函数func,完成装饰的功能。
当用装饰器去装饰带参数的函数值,内嵌函数的参数和返回值要和被装饰的函数相同。
用装饰器去装饰类也是一样的:
例子:
定义装饰类的装饰器:decorate_Pos(),在装饰器内部定义一个类InnerClass并当做返回值返回,则该闭包会代替需要被装饰的类。原来只能打印两个坐标通过装饰后可打印三个。被装饰后的类的调用方法和原来一样。