一. 装饰器
什么是装饰器, :闭包的一个应用, 外层函数返回内层函数, 并且不改变内层函数的执行方式以及结果
旨在内层函数执行前后加一些功能, 原函数的结构不做修改
for Eone :
def wrapper(func):
def inner(*args, **kwargs):
print("函数执行前")
ret = func(*args,**kwargs)
print('函数执行后')
return ret
return inner
@wrapper
def add(x, y):
print(x, '+', y)
return x + y
print(add(2, 3))
for Etwo
def outer(flag):
def wrapper(func):
def inner(*args, **kwargs):
if flag:
print('要执行打印')
ret = func(*args, **kwargs)
if flag:
print('执行打印,函数执行完毕')
return ret
return inner
return wrapper
# flag = True
flag = False
@outer(flag)
def add(x, y):
print(x, '+', y)
return x + y
print(add(3, 2))
for E3:
def wrapper1(func):
def inner(*args, **kwargs):
print("order1")
ret = func(*args, **kwargs)
print(('order2'))
return ret
return inner
def wrapper2(func):
def inner(*args, **kwargs):
print("order3")
ret = func(*args, **kwargs)
print(('order4'))
return ret
return inner
# @wrapper
@wrapper2
@wrapper1
def add(x, y):
print(x, '+', y)
return x + y
print(add(3, 6)) # order3, order1, 2+3 , order2, order4 ret(5)
'''
@wrapper
@wrapper2
@wrapper1
def add(x, y):
print(x, '+', y)
return x + y
二. 装饰器修复技术: 引入工具, 将原函数的文档,以及属性等等还原给inner,消除inner带来的影响
from functools import wraps
def wrapper0(func):
@wraps(func) # 看这里
def inner(*args, **kwargs):
'''
doc: 这个闭包可以用, 没什么用
写写文档
'''
print("函数执行前")
ret = func(*args,**kwargs)
print('函数执行后')
return ret
return inner
@wrapper0
def add0(x, y):
print(x, '+', y)
return x + y
print(add0.__name__)