Python闭包与装饰器核心机制详解
本文深入解析Python中闭包的定义与变量作用域机制,重点演示如何通过nonlocal修改外部函数变量。同时系统讲解装饰器的实现原理,涵盖无参、有参、不定长参数及带返回值函数的装饰方法,并剖析多个装饰器叠加时的执行顺序与结果。
闭包
闭包是指一个函数能够访问并读取其外部(非全局)作用域中变量的函数。
def test1(k, b):
def test1_1(x):
print(k*x+b)
return test1_1
t1 = test1(1, 2)
t1(0)
t1(1)
t1(2)
在闭包内部修改外部数据
x = 300
def test1():
x = 200
def test2():
nonlocal x
print("----1----x = {}".format(x))
x = 100
print("----2----x = {}".format(x))
return test2
t1 = test1()
t1()
装饰器
实现针对无参数函数的装饰器
def set_func(func):
def call_func():
print("装饰器执行")
func()
return call_func
@set_func # 等价于sumNum = set_func(sumNum)
def sumNum():
print("sumNum")
sumNum()
实现针对带有参数的函数的装饰器
# 对有参数、无返回值的函数进行装饰
def set_func(func):
def call_func(num):
print("装饰器")
func(num)
return call_func
@set_func
def sumNum(num):
print("sumNum = {}".format(num))
sumNum(100)
针对接收不定长参数的函数进行装饰
def set_func(func):
def call_func(*args, **kwargs):
print("装饰器")
func(*args, **kwargs) # 拆包
return call_func
@set_func
def sumNum(num, *args, **kwargs):
print("sumNum = {}".format(num))
print("args = {}".format(args))
print("kwargs = {}".format(kwargs))
sumNum(100, 200, c=100)
针对具有返回值的函数进行装饰
def set_func(func):
def call_func(*args, **kwargs):
print("装饰器")
return func(*args, **kwargs) # 拆包
return call_func
@set_func
def sumNum(num, *args, **kwargs):
print("sumNum = {}".format(num))
print("args = {}".format(args))
print("kwargs = {}".format(kwargs))
return "200 ok"
sumNum(100, 200, c=100)
多个装饰器同时应用于同一个函数
def add_h1(func):
def h1():
h1_str = "<h1>" + func() + "</h1>"
return h1_str
return h1
def add_a(func):
def call_func():
a_str = "<a>" + func() + "</a>"
return a_str
return call_func
@add_h1
@add_a
def get_str():
return "haha"
get_str()
最终输出结果为:<h1><a>haha</a></h1>
总结
本文内容到此结束,希望能为读者提供有价值的参考,同时也欢迎大家关注本站以获取更多技术内容。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









