python的装饰器
python的装饰器
1.闭包函数
在了解装饰器之前,我们先理解下闭包函数的概念,python是一种面向对象的编程语言,在python中一切皆对象,这样就使得变量所拥有的属性,函数也同样拥有。这样我们就可以理解在函数内创建一个函数的行为是完全合法的。这种函数被叫做内嵌函数,这种函数只可以在外部函数的作用域内被正常调用,在外部函数的作用域之外调用会报错,例如:
外部函数outFunc()可以被调用,但是闭包函数inFunc()则无法调用。
闭包函数主要满足2点:1.函数内部定义的函数;2.引用了外部变量,但非全部全局变量。
2.装饰器
python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,
装饰器的返回值也是一个函数对象(函数的指针)。
装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。
从上面这段描述中我们需要记住装饰器的几点属性,以便后面能更好的理解:
- 实质: 是一个函数
- 参数:是你要装饰的函数名(并非函数调用)
- 返回:是装饰完的函数名(也非函数调用)
- 作用:为已经存在的对象添加额外的功能
- 特点:不需要对对象做任何的代码上的变动
2.1.函数的装饰器
myfunc是我要装饰的函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象,@outFunc相当于myfunc = outFunc(myfunc),为myfunc函数装饰并返回。
2.2,带有参数的装饰器
我们可以在装饰器里面加入参书myfunc要与inFunc保持一致,即可传入参数。
也可以在在@outFunc上传入一个参数,执行的相当于 myfunc = outFunc('info')(myfunc),这样就可以传入对应的参数值。
也可以加上两个装饰器,方法跟一个装饰器的方式一样,执行是先第一个装饰器,然后调到第二个装饰器,执行函数。相当于myfunc = outFunc(Func(myfunc))
3.模块、方法、函数的关系