装饰器
[toc]
一、闭包
(一)什么是闭包
-
闭包:内层函数调用外层函数的变量就是闭包(不能是全局变量)
def func1():a = 10def func2():print(a) # 内层函数调用外层函数的变量,这就是一个闭包func1() -
检测闭包的方法
函数名.__closure__- 若返回对象地址就是一个闭包,返回None就不是一个闭包
- 注意:
.__closure__检测的是函数名,判断这个函数是否是闭包
def func1():a = 10def func2():print(a) # 调用外层变量a,是闭包print(func2.__closure__) # 判断func2是否是闭包func1()运行结果:(<cell at 0x00000230F21874F8: int object at 0x0000000063258190>,)def func1():a = 10def func2():a = 10print(a) # 使用自身函数变量a,不是闭包print(func2.__closure__)func1()运行结果:None -
如何在全局空间中调用内部函数
- 外层函数返回内层函数的函数名(内存地址),就可在全局空间中调用内部函数
def func1():a = 10def func2():print(a)return func2 # 返回内层函数的函数名f = func1() # 此时f就是func2f() # 调用内层函数func2print(f.__closure__)运行结果:10(<cell at 0x00000280A87574F8: int object at 0x0000000063258190>,)