python--装饰器,,为什么要有装饰器?开
python--装饰器,,为什么要有装饰器?开
为什么要有装饰器?
开放封闭原则:对修改封闭,对扩展开放
什么是装饰器?
装饰器是可调用的函数,被装饰者也是可以调用的函数
原则:不修改被装饰者的代码,不改变被装饰者的调用方式
目的:给被装饰者添加功能
实现过程
1 #原始index函数 2 import time 3 def index(): 4 time.sleep(3) 5 print(‘贼溜‘) 6 return ‘大牛‘ 7 8 #为index函数添加功能 9 strat_time = time.time()10 index()11 end_time = time.time()12 print(end_time - strat_time)13 14 #上述添加过程在为其他函数添加功能时,需要重复写代码,改进如下15 def wrapper():16 strat_time = time.time()17 index()18 end_time = time.time()19 print(end_time - strat_time)20 wrapper()21 22 #上述改进过程,只能为index()添加功能,而且改变了index的调用方式,改进如下23 def timmer(func):24 def wrapper():25 strat_time = time.time()26 res=func()27 end_time = time.time()28 print(end_time - strat_time)29 return res30 return wrapper31 index=timmer(index) #闭包函数的概念---timmer(index)实际上就是调用了一个带有func=index参数的wrapper()32 33 #改进依然不完美,当传入的函数带有参数时,程序报错,改进如下34 def timmer(func):35 def wrapper(*args,**kwargs):36 strat_time = time.time()37 res=func(*args,**kwargs)38 end_time = time.time()39 print(end_time - strat_time)40 return res41 return wrapper42 #至此,装饰器完成,得到如下模板43 def outter(func):44 def wrapper(*args,**kwargs):45 res = func(*args,**kwargs)46 return res47 return wrapper48 #任何装饰器都可以套用此模板
基本语法
@deco1@deco2@deco3def foo(): passfoo =deco1(deco2(deco3(foo)))foo()是需要被装饰的函数
无参装饰器
import timedef timmer(func): def wrapper(*args,**kwargs): #wrapper()为闭包函数 start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print(‘run time is %s‘ %(stop_time-start_time)) return res return wrapper #timmer()的返回值指向函数wrapper()的内存地址@timmerdef foo(): time.sleep(3) print(‘from foo‘)foo()
有参装饰器
def auth(driver=‘file‘):#此处可以添加任意参数,所有有参装饰器最多三层即可 def auth2(func): #此处的func固定,不允许添加值,只能是被装饰函数的内存地址 def wrapper(*args,**kwargs):#此处不允许修改,一旦修改,则程序在装饰有参函数和无参函数时,其中一个肯定报错 name=input("user: ") pwd=input("pwd: ") if driver == ‘file‘:#作用域知识,本层找不到,往外部找 if name == ‘egon‘ and pwd == ‘123‘: print(‘login successful‘) res=func(*args,**kwargs) return res elif driver == ‘ldap‘: print(‘ldap‘) return wrapper return auth2@auth(driver=‘file‘)def foo(name): print(name)res = auth(driver=‘file‘)print(res)foo(‘egon‘)
python--装饰器
评论关闭