闭包
- 官方点的解释:内部函数(闭包函数)对外部函数作用域里变量的引用
- 原因:函数内的属性都是有生命周期的,生命周期是在函数执行期间,那么如果想在函数生命周期结束后仍然使用怎么办呢——采用闭包函数
- 函数内的闭包函数私有化了变量,完成了数据的封装,类似于面向对象
例子
def func(): # 外部函数
a = 1 # 外部函数作用域里的变量
print("This is func.")
def func1(num): # 内部函数(闭包函数)
print("This is func1")
print(num + a)
return func1 # 函数
# func() # 运行外部函数,内部函数就被创建了
var = func() # var = func1
var(3)
输出:
This is func.
This is func1
4
装饰器(基于闭包)
- 不影响原有函数的功能,还能添加新的功能
- 装饰器函数带参数:多一层包装来接受装饰器的参数
- 被装饰的函数带参数:只需要在最内部闭包函数内传入参数即可
例子
def func1(func): # 外部闭包函数的参数是被装饰的函数对象
def func2():
print("aaabbb")
return func() # 返回了外部装饰函数的参数被装饰的调用。注意这个括号一定要带,带了才是执行这个函数,否则是返回一个函数对象
return func2
# return func,返回集装箱
# return func(),返回函数调用
@func1
def myprint():
print("hello i am print")
myprint() # 相当于func1(myprint)()
参考:https://www.bilibili.com/video/BV1JW411i7HR/?spm_id_from=autoNext