装饰器 -面试必需品
- 不想修改函数的调用方式,但是还想在原来函数前后添加功能
import time
#定义被装饰的函数
def func():
print('我测试函数的运行速度')
#定义装饰器,必须是闭包
def timer(f):
def func():
start = time.time()
time.sleep(1)
f()
end = time.time()
print(end - start)
return func
#调用
func = timer(func)
func() 让其看起来像是直接调用的函数func达到测试时间的效果
- 语法糖
import time
#定义装饰器
def timer(f):
def func():
start = time.time()
time.sleep(1)
f()
end = time.time()
print(end - start
return func
@timer #采用装饰器的效果
def func():
print('我测试函数的运行速度')
#调用
#func = timer(func) 这句话直接用 @装饰器名 代替
func() #采用装饰器后直接调用原函数就行
装饰器的形成过程
- 最简单的>>有返回时的>>有一个参数的>>万能参数
装饰器的作用
原则:开放封闭原则
- 开放
- 封闭
- 对修改是封闭的,函数一但定义并确认不能轻易的修改或者不修改
装饰器的固定模式
#定义装饰器
def wrapper(f): #f是被装饰的函数
def inner(*args, **kwargs):
'''执行被装饰的函数之前需要执行的'''
ret = f(*args, **kwargs)
'''执行被装饰的函数之后需要执行的'''
return ret
return inner
@wrapper #调用装饰器
def func()
pass
#调用
func() #实际上是调用inner()