标签:保存 结果 pytho closure 使用 调用 span 对象 lin
def funcOut():
name = ‘Jery‘
def funcIn():
# format的简写方式
print(f"姓名 = {name}")
return funcIn
f = funcOut()
f()
运行结果:
姓名 = Jery
funcIn.__closure__:返回None,则不是闭包函数def funcOut():
name = ‘Jery‘
def funcIn():
print(f"姓名 = {name}")
print(funcIn.__closure__)
print(funcIn.__closure__[0].cell_contents) # 第一个外部变量
return funcIn
f = funcOut()
f()
运行结果
(<cell at 0x000000000272F8B8: str object at 0x00000000026A08B8>,) Jery 姓名 = Jery
装饰器
def writeLog(fn):
print("记录日志")
print(‘访问方法:‘+fn.__name__)
def funcOut(func):
def funcIn():
writeLog(func)
func()
return funcIn
def fun1():
print("使用功能1")
def fun2():
print("使用功能2")
fun1 = funcOut(fun1)
# 装饰器(闭包)
fun1()
运行结果:
记录日志 访问方法:fun1 使用功能1
使用装饰器(语法糖)解决
def writeLog(fn):
print("记录日志")
print(‘访问方法:‘+fn.__name__)
def funcOut(func):
def funcIn():
writeLog(func)
func()
return funcIn
@funcOut
def fun1():
print("使用功能1")
@funcOut
def fun2():
print("使用功能2")
fun1()
fun2()
运行结果:
记录日志 访问方法:fun1 使用功能1 记录日志 访问方法:fun2 使用功能2
如:
def war1(func):
print("war 1")
def inner(*args, **kwargs):
print("======war1 start=====")
func(*args, **kwargs) # inner
print("======war1 end=====")
return inner
def war2(func):
print("war2")
def inner(*args, **kwargs):
print("======war2 start=====")
func(*args, **kwargs)
print("======war2 end=====")
return inner
@war1
@war2
def f():
print("****self****")
f()
war2 war1 ======war1 start===== ======war2 start===== ****self**** ======war2 end===== ======war1 end=====
(1)
@war1
@war2 之后相当于 --> f = war1(war2(f))
其中war2(f)是一个函数,作为实参传递
war2(f):
print("======war2 start=====")
print("****self****")
print("======war2 end=====")
war1(war2(f)):
print("======war1 start=====")
war2(f)
print("======war1 end=====")
(2)
f() 相当于执行 --> war1(war2(f))()
def funcOut(fn):
print("funcOut")
def funcIn(aa, bb):
print("funcIn1")
fn(aa,bb)
print("funcIn2")
return funcIn
@funcOut
def test(a, b):
print("a=%d,b=%d" % (a, b))
# 装饰器装饰之后,这不是直接调用test方法,而是调用func_in方法
test(1,2)
结果
funcOut funcIn1 a=1,b=2 funcIn2
def funcOut(fn):
# 需要有参数,*args,**kwargs
def funcIn(*args,**kwargs):
print("记录日志")
print(‘访问方法:‘+fn.__name__)
# 需要有参数,*args,**kwargs
# 需要有返回值
return fn(*args,**kwargs)
return funcIn
# 待装饰函数1:无参数,无返回值
@funcOut
def test1():
print("test1")
test1()
print("---------")
# 待装饰函数2:无参数,有返回值
@funcOut
def test2():
return "Hello"
print(test2())
print("---------")
# 待装饰函数3:有参数,无返回值
@funcOut
def test3(a):
print(‘a=%d‘%a)
test3(1)
print("---------")
# 待装饰函数3:有键值对参数,无返回值
@funcOut
def test4(**kwargs):
print(kwargs)
test4(a=1)
记录日志 访问方法:test1 test1 --------- 记录日志 访问方法:test2 Hello --------- 记录日志 访问方法:test3 a=1 --------- 记录日志 访问方法:test3 {‘a‘: 1}
标签:保存 结果 pytho closure 使用 调用 span 对象 lin
原文地址:https://www.cnblogs.com/songdanlee/p/11367571.html