装饰器
闭包
闭包概念
闭包是函数式编程的重要语法结构,Python支持这一特性
在一个外函数中定义(嵌套)了一个内函数,内函数中运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样构成了闭包。
构成条件
- 必须有一个内嵌函数(函数里定义函数)——这对应函数之间的嵌套
- 内嵌函数必须引用一个定义在闭合范围内(外部函数)的变量——内部函数引用外部变量
- 外部函数必须返回内嵌函数——必须返回内部函数
简单实现
# @date : 2022/10/21 16:44
# @author : hahazhong
# @coding : UTF-8
# @object : 实现一个简单的闭包
def function_out(num):
print('1.function_out---------------num=', num)
def function_in(num_in):
print('2.function_in---------------num=', num)
print('3.function_in---------------num_in=', num_in)
return function_in
# function_out(10)
# 调用外层函数,获取内层函数地址,保存到ret变量中
ret = function_out(100)
# 调用里层函数
ret(66)
# 结果:
# 1.function_out---------------num= 100
# 2.function_in---------------num= 100
# 3.function_in---------------num_in= 66
闭包中的变量问题
问题:内层定义了和外层同名的变量
报错:UnboundLocalError: local variable 'num' referenced before assignment
解决办法:如果在内层定义了和外层同名的变量,二使用外部变量,使用nonlocal关键字进行约束,nonlocal表示用内部定义变量而使用外部变量
# @date : 2022/10/21 17:01
# @author : hahazhong
# @coding : UTF-8
# @object : 了解闭包变量问题
def function_out(num):
print('1.function_out---------------num=', num)
def function_in():
# 错误原因:编译器认为内层函数已经定义了num变量,优先使用内部变量
# 如果在内层定义了和外层同名的变量,二使用外部变量
# nonlocal 表示用内部定义变量而使用外部变量
nonlocal num
print('2.function_in---------------num=', num)
# 内部自定义变量
num = 99
return function_in
# function_out(10)
# 调用外层函数,获取内层函数地址,保存到ret变量中
ret = function_out(100)
# 调用里层函数
ret()
装饰器入门
装饰器:在不改变函数代码前提下,给函数添加新的功能
使用前提:
- 存在闭包(用于扩展新功能)
- 待扩展的普通函数(目的就是不改变函数,还增加新的功能)
语法格式:
@闭包外层函数xxx # 此处作用使用xxx装饰函数,给其扩展功能
def func():
pass
开放封闭原则
规定已经实现的功能代码不允许被修改,但可以扩展,即:
- 封闭:已经实现的功能代码块