今日内容:
1.装饰器
2.内置函数
1.装饰器
对现有函数不进行任何修改的进行功能扩展。
开放封闭原则:
1.对扩展开放
2.对修改封闭,不修改源代码
3.不改变之前的调用方式
简单版装饰器:
import time def func(a,b): print("旧功能") print(a if a > b else b) time.sleep(1) def wrapper(f): def inner(*args,**kwargs): # 接收多个参数 print("新功能") start = time.time() f(*args,**kwargs) print("执行时间:%s."%(time.time()-start)) return inner func = wrapper(func) func(10,20) """ 新功能 旧功能 20 执行时间:1.000023603439331. """
语法糖版本:
import time def wrapper(f): def inner(*args,**kwargs): print("新功能") start = time.time() f(*args,**kwargs) print("执行时间:%s."%(time.time()-start)) return inner @wrapper # func = wrapper(func) def func(a,b): print("旧功能") print(a if a > b else b) time.sleep(1) func(10,20)
套了多层装饰器:
import time def wrapper(f): def inner(*args,**kwargs): print(1) print("新功能") start = time.time() f(*args,**kwargs) print("执行时间:%s."%(time.time()-start)) return inner def wrapper2(f): def inner(*args,**kwargs): print(2) print("新功能") start = time.time() f(*args,**kwargs) print("执行时间:%s."%(time.time()-start)) return inner def wrapper3(f): def inner(*args,**kwargs): print(3) print("新功能") start = time.time() f(*args,**kwargs) print("执行时间:%s."%(time.time()-start)) return inner # wrapper3 包着 wrapper2 包着 wrapper 包着 原func @wrapper3 # func = wrapper3(func) # 新func --> wrapper3 : inner --> wrapper2 : inner --> wrapper : inner --> 原func @wrapper2 # func = wrapper2(func) # 新func --> wrapper2 : inner --> wrapper : inner --> 原func @wrapper # func = wrapper(func) # 新func -- > wrapper : inner --> 原func def func(a,b): print("旧功能") print(a if a > b else b) time.sleep(1) # func = wrapper(func) # func = wrapper2(func) # func = wrapper3(func) func(10,20) """ 3 新功能 2 新功能 1 新功能 旧功能 20 执行时间:1.000126838684082. 执行时间:1.000126838684082. 执行时间:1.000126838684082. """
需要查询原函数信息需要用到:wraps()
# 装饰器----对原函数操作 import time from functools import wraps def wrapper(f): @wraps(f) # 返回正确的函数名的内容 def inner(*args,**kwargs): print("新功能") start = time.time() f(*args,**kwargs) print("执行时间:%s."%(time.time()-start)) return inner @wrapper # 相当于 func = wrapper(func) def func(a,b): """ 原func的注释。 """ print("旧功能") print(a if a > b else b) time.sleep(1) print(func.__name__) print(func.__doc__) func(10,20) """ func #不用@wraps() 返回的内容为inner 原func的注释。 新功能 旧功能 20 执行时间:1.0000817775726318. """
动态使用装饰器:
from functools import wraps import time def test(flag): def wrapper(func): if flag: @wraps(func) def inner(*args,**kwargs): print("新功能") result = func(*args,**kwargs) return result return inner else: return func return wrapper # False 表示不使用装饰器功能,True表示使用 @test(True) # 相当于 func = test(False)(func) def func(): print("旧功能") time.sleep(1) return 1 print(func()) print(func.__name__)