装饰器

一. 装饰器
什么是装饰器, :闭包的一个应用, 外层函数返回内层函数, 并且不改变内层函数的执行方式以及结果
旨在内层函数执行前后加一些功能, 原函数的结构不做修改

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__)
原文地址:https://www.cnblogs.com/tcpblog/p/10065828.html