一:闭包
格式:
def 外部函数:
def 内部函数:
pass
return 内部函数的引用(地址)
例子:
"""
闭包:在函数fn里面定义一个函数(如:inner()),inner中调用了fn(inner外)的变量,
并且fn返回的是inner的引用
"""
def decorator(fn):
def inner():
print("--1 闭包:我是inner--")
fn()
print("--2 闭包:我是inner--")
return inner
def test():
print("--我是test--")
fun = decorator(test)
print(fun())
输出:
二:装饰器(@XXX)
例子:
def one(func):
print("--我是装饰器--")
def one_inner():
print("---1---")
return "<one>" + func() + "</one>"
return one_inner
def two(func):
def two_inner():
print("--2--")
return "<two>" + func() + "</two>"
return two_inner
@one
def test():
print("---3---")
return "hello word"
print(test) # 函数test的地址
ret = test()
print(ret)
输出:
有结果可以看出在执行函数之前就执行了装饰器
2.2 多个装饰器
修改下列这段代码,添加 two 装饰器
@one
@two
def test():
print("---3---")
return "hello word"
输出:
2.3 装饰带参函数
def decorator(fn):
def inner(*args, **keywords): #可接受任意参数
fn(*args, **keywords) #拆包
return inner
@decorator
def test(a, b):
print("a + b:", a + b)
test(3, 5)
结果: a + b:8
2.4 装饰带有返回值的函数
def func(funcName):
print("--func--1--")
def func_in():
print("--func_in--1--")
ret = funcName() #保存返回值,此处为 "hello world"
print("--func_in--2--")
return ret #返回 "hello world"
print("--func--2--")
return func_in
@func
def test():
print("--我是 test --")
return "hello world"
ret = test()
print("test return value:", ret)
输出:
--func--1--
--func--2--
--func_in--1--
--我是 test --
--func_in--2--