装饰器:
在不改变原函数的代码和调用方法的基础上,给原函数增加额外的功能
理解声明:为了方便理解,以下例子采用最简洁的函数和添加的功能(给原函数添加一个执行时间)
import time
def timer(func):
def inner():
func()
return inner
@timer # func = timer(func)
def func():
print('in the func')
func()
以上便实现了一个简单的装饰器
带参数的装饰器
flag = True #设置一个简单的开关来更改之前的装饰器使用
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(flag) # outer(flag) = timer -> @timer
def func1():
print('func1')
func1()
flag = False
func1()
多个装饰器装饰一个函数
def wrapper1(func):
def inner(*args,**kwargs):
print('warpper1 前')
ret = func(*args, **kwargs)
print('wrapper1 后')
return ret
return inner
def wrapper2(func):
def inner(*args,**kwargs):
print('warpper2 前')
ret = func(*args, **kwargs)
print('wrapper2 后')
return ret
return inner
@wrapper2 # func1 = wrapper2(func1) => inner
@wrapper1 # func1 = wrapper(func1) => inner
def func1():
print('func1')
func1()
他们之间的关系:(同一种颜色表示他们本身等价)
执行结果:
解释器在解释的时候先装饰靠近函数的装饰器
结构图: