11python(第十一天日记)
初识装饰器
1.为何要用装饰器:开放封闭原则:对修改封闭,对扩展开放
2.上面是装饰器:装饰他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
3.装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式
4.装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能
5.装饰器语法:
被装饰函数的正上方,单独一行 @deco1 @deco2 @deco3 def foo(): pass foo=deco1(deco2(deco3(foo)))
def timer(func): def inner(*args,**kwargs): '''执行函数之前要做的''' re = func(*args,**kwargs) '''执行函数之后要做的''' return re return inner
@timer
def foo()
print(......)
foo()
6.装饰器的使用:
import time def timmer(func): def wrapper(*args,**kwargs): 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 def foo(): #装饰器是给foo()增加功能,但不能改变最后一层调用foo()与此层变量foo()的结构 time.sleep(3) print('from foo') foo()
有参装饰器
def auth(driver='file'): def auth2(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) foo('egon')