装饰器
装饰器 :在不改变原函数的代号和调用方法的基础上, 给原函数额外增加功能 .
普通装饰器
def warpper(func):
def inner(*args,**kwargs):
# 原函数执行之前的操作
ret = func(*args,**kwargs)
# 原函数执行之后的操作
return ret
return inner
@warpper # func1 = warpper(func1) == inner
def func1(*args,**kwargs):
func1(*args,**kwargs)
带参数的装饰器
def outer(flag):
def timer(func):
def inner(*args, **kwargs):
ret = func(*args, **kwargs)
if flag:
print(time.time())
return ret
return inner
return timer
@outer(True) # outer(True) --> @timer -> func1 = timer(func1) => inner
def func1():
print('func1')
func1()
多个装饰器装饰一个函数
def wrapper1(func):
def inner(*args, **kwargs):
print('wrapper1 前')
ret = func(*args, **kwargs)
print('wrapper1 后')
return ret
return inner
def wrapper2(func):
def inner(*args, **kwargs):
print('wrapper2 前')
ret = func(*args, **kwargs)
print('wrapper2 后')
return ret
return inner
@wrapper2 # func1 = wrapper2(wrapper.inner1) wrapper2.inner
@wrapper1 # func1 = wrapper1(func1) wrapper1.inner
def func1():
print('func1')
func1() # w2 前 -> w1 前 -> func1 -> w1 后 -> w2 后
装饰器的修复技术
from functools import wraps
def wrapper1(func):
@wraps(func)
def inner(*args, **kwargs):
ret = func(*args, **kwargs)
return ret
return inner
@wrapper1
def func1():
"""
func1注释的内容
:return:
"""
print('func1')
@wrapper1
def func2():
print('func2')
print(func1.__name__) # func1
print(func2.__name__) # func2
print(func.__doc__) # 显示注释的内容