装饰器(2)
1 什么是装饰器
器=》工具=》函数
装饰=》指的是为被装饰者添加新功能
2、为何要用装饰器
开放封闭原则:
封闭指的是对修改源代码是封闭的
开放指的是对拓展新功能是开放的
装饰器就是一个函数,该函数就是在不修改被装饰对象源代码以及调用的方式的前提下,为被装饰对象添加额外的功能
3、如何实现装饰器=》闭包函数
装饰器的目标:为被装饰对象添加额外的新功能
装饰器的实现应该遵循的原则:
1、不该被装饰对象的源代码
2、不该被装饰对象的调用方式
4.示例
# 例1: import time def index(): start=time.time() print("index===>") time.sleep(0.5) stop=time.time() print("run time is : %s" %(stop - start)) index() # 例2: import time def index(): print("index===>") time.sleep(0.5) start=time.time() index() stop=time.time() print("run time is : %s" %(stop - start)) # 例3: import time def index(): print("index===>") time.sleep(0.5) def wrapper(): start=time.time() index() stop=time.time() print("run time is : %s" %(stop - start)) wrapper() # 例4:直接通过参数为函数体传参 import time def index(): print("index===>") time.sleep(0.5) def wrapper(func): start=time.time() func() stop=time.time() print("run time is : %s" %(stop - start)) wrapper(index) # 例5:直接通过参数为函数体传参 import time def index(): print("index===>") time.sleep(0.5) def outter(func): # func=index的内存地址 def wrapper(): start=time.time() func() stop=time.time() print("run time is : %s" %(stop - start)) return wrapper # 千万不要加括号 index=outter(index) index() # wrapper() # 例6: import time def index(x,y,z): print("index===>",x,y,z) time.sleep(0.5) return 123 def home(name): print('welcome %s to home page' %name) time.sleep(1) # index(1,2,3) # home("egon") def outter(func): # func=index的内存地址 def wrapper(*args,**kwargs): start=time.time() res=func(*args,**kwargs) stop=time.time() print("run time is : %s" %(stop - start)) return res return wrapper # 千万不要加括号 index=outter(index) res=index(1,2,3) # wrapper(1,2,3) print(res) home=outter(home) res=home("egon") print(res) # 例7:语法糖 import time from functools import wraps def timmer(func): @wraps(func) def wrapper(*args,**kwargs): start=time.time() res=func(*args,**kwargs) stop=time.time() print("run time is : %s" %(stop - start)) return res # wrapper.__name__=func.__name__ # wrapper.__doc__=func.__doc__ return wrapper # 千万不要加括号 @timmer # index=timmer(index) def index(x,y,z): """ index的文档注释 """ print("index===>",x,y,z) time.sleep(0.5) return 123 @timmer # home=timmer(home) def home(name): """ home的文档注释 """ print('welcome %s to home page' %name) time.sleep(1) res=index(1,2,3) # wrapper(1,2,3) print(res) res=home("egon") print(res) # help(index) print(index.__name__) # 例8: def auth(func): def wrapper(*args,**kwargs): name=input("username>>: ").strip() pwd=input("password>>: ").strip() if name == "egon" and pwd == "123": print('login successful') res=func(*args,**kwargs) return res else: print("username or password error") return wrapper @auth def index(): print('from index') index()