Python装饰器的定义:在代码运行期间在不改变原函数定义的基础上,动态给该函数增加功能的方式称之为装饰器(Decorator)
装饰器的优点和用途:
1. 抽离出大量函数中与函数功能本身无关的的雷同代码并继续重用。
2. 使用装饰器可以将函数“修饰”为完全不同的行为,可以有效的将业务逻辑正交分解,如用于将权限与身份验证从业务中独立出来。
3. 如果一个函数需要一个功能,且这个功能可以被使用在很多函数上,或是函数并不是自己实现,那可以写个装饰器来实现这些功能。
概况来说,装饰器的作用就是为已经存在的对象添加一些额外的功能。
在学习如何运用装饰器前我们先来学习以下几个知识点:
1.变量的作用域:
在python中,函数会创建一个自己的作用域或称之为命名空间,结合以下示例来展示函数命名空间的作用域。
示例代码1:
#coding=utf-8
outerVar = "this is a global variable"
def test() :
innerVar = "this is a Local variable"
print ("local variables :")
print (locals()) #locals函数返回的是函数test()内部本地作用域中的可用的变量名称的字典(变量名:值)
test()
print ("global variables :")
print (globals()) #globals函数返回的是python程序中的可用的变量名称的字典(变量名:值)
#执行结果:
local variables :
{'innerVar': 'this is a Local variable'}
global variables :
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000015848FE87F0>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'test.py', '__cached__': None,'outerVar': 'this is a global variable',
'test': <function test at 0x0000015848E11E18>}
2.变量解析规则:
在python的作用域规则里面,创建变量时一定会在当前作用域里创建同样的变量,但访问或修改变量时,会在当前作用域中查找该变量,如果没找到匹配的变量,就会依次向上在闭合作用域中进行查找,所以也可以在函数中直接访问全局变量。
示例代码2:
#coding=utf-8
outerVar = "this is a global variable"
def test() :
innerVar = "this is a Local variable"
print (outerVar) #获取全局变量outerVar值
print (n) #获取全局变量n的值
n = 33
test()
#执行结果:
this is a global variable
33
3.变量的生存空间:
变量不仅仅是存在于一个个的命名空间中,它们还都有自己的生存周期,全局变量的生存周期是在整个程序执行期间有效,而局部变量的生存周期只在当前作用域中有效,一旦这个作用域不存在了,比如函数执行退出了,变量的生存周期就结束了。
示例代码3:
#coding=utf-8
outerVar = "this is a global variable"
def test() :
innerVar = "this is a Local variable"
test()
print (innerVar) #test函数执行结束后,innerVar变量已释放,再访问函数内部变量就会报NameError
执行结果:
Traceback (most recent call last):
File "test.py", line 56, in <module>
print (innerVar)
NameError: name 'innerVar' is not defined
4.嵌套函数:
定义:嵌套函数就是在函数里面定义函数,而且现有的作用域和变量生存周期依旧不变。
说明:在python里,函数就是对象,它也只是一些普通的值而已。也就是说你可以把函数像参数一样传递给其他的函数或者说从函数了里面返回函数。
示例代码4:
#coding=utf-8
def outer() :
name = "python"
def inner() :
#获取name变量值时,python解析器默认会先在函数内部查找,查找失败后,继续往上一层函数作用域查找。
print(name)
#python解释器会优先在outer的作用域里面查找变量名为inner的变量。把作为函数标识符的变量inner作为返回值返回。
每次函数outer被调用的时候,函数inner都会被重新定义,如果它不被当做变量返回的话,每次执行过后它将不复存在。
return inner()
print (outer())
结果:
python
None #inner函数默认返回值为None
嵌套函数返回函数不加()表示返回函数对象,如下示例5所示:
示例代码5:
#coding=utf-8
def outer() :
name = "python"
def inner() :
print( name)
return inner #表示返回函数对象
print (outer())
执行结果:
<function outer.<locals>.inner at 0x0000027446B6A9D8>
5.函数作为变量:
python中函数可以作为参数来传递