在函数执行前输出 before
,在函数执行之后输出after
def func():
print('before') # 直接输出即可
print('我是func函数')
print('after')
value = (11, 22, 33)
return value
res = func()
print(res)
闭包。调用outer
函数,将func
引用传给origin,接着将inner
函数再重新传递给func
,此时执行func
函数,其实执行的就是inner
函数
,就是执行的origin
函数,这个origin
函数是func
的引用,到底是执行的还是原来的func
def func():
print('我是func函数')
value = (11, 22, 33)
return value
def outer(origin):
def inner():
print('before')
res = origin()
print('after')
return res
return inner
func = outer(func)
res = func()
print(res)
装饰器本质代码 ----> func = outer(func)
,就是将func
函数作为参数,然后传到outer
中,然后再赋值给func
def outer(origin):
def inner():
print('before')
res = origin()
print('after')
return res
return inner
@outer
def func():
print('我是func函数')
value = (11, 22, 33)
return value
res = func()
print(res)
如果需要装饰的函数比较多,那么一个一个写不是最明智的写法,装饰器可以简便操作。
def outer(origin):
def inner():
print('before')
res = origin()
print('after')
return res
return inner
@outer
def func1():
print('我是func1函数')
return
@outer
def func2():
print('我是func2函数')
return
@outer
def func3():
print('我是func3函数')
return
func1()
func2()
func3()
可支持任意参数的情况, 引入 *args, **kwargs
def outer(origin):
def inner(*args, **kwargs):
print('before')
res = origin(*args, **kwargs)
print('after')
return res
return inner
@outer
def func1(a):
print('我是func1函数')
return
@outer
def func2(a, b):
print('我是func2函数')
return
@outer
def func3(a, b, c):
print('我是func3函数')
return
func1(1)
func2(1, 2)
func3(1, 2, 3)