什么是装饰器
为被装饰器对象添加额外功能的一种工具
为什么用装饰器
软件维护中应该遵从开放封闭的原则
封闭源代码,对程序的扩展是开放的
1、不改变程序的源代码
2、不改变程序的调用方式
如何用装饰器
1、无参装饰器
运行一个程序,装饰上一个程序运行了几秒钟的工具
import time def index(): print('welcom to index') time.sleep(3) def timmer(func): def wrapper(*args, **kwargs): start = time.time() func(*args, **kwargs) stop = time.time() print('run time is %s' % (stop - start)) return wrapper index=timmer(index)
index()
补充:
@加装饰器的变量名 可以直接省略 这个步骤
index=timmer(index)
装饰器固定套路
def deco(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper
2、有参装饰器
扫描二维码关注公众号,回复:
1571149 查看本文章
我们可以从固定套路中看出 函数 deco 和func 参数都已经固定死了。如果需要为函数里面传参的话,我么只能在deco函数外面又套一个函数 ,进行传参。
import time current_user = {'urse': None} def auth(engine='file'): def deco(func): def wrapper(*args, **kwargs): if current_user['urse']: res = func(*args, **kwargs) return res user = input('username>>:') pwd = input('password>>:') if engine == 'file': if user == 'egon' and pwd == '123': print('login successful') current_user['urse'] = user res = func(*args, **kwargs) return res else: print('user or pqssword error') elif engine == 'mysql': print('基于mysql的认证') elif engine == 'ldap': print('基于ldap的认证') else: print('无法识别认证来源') return wrapper return deco @auth() def index(): print('welcome to index page') time.sleep(1) @auth() def home(name): print('welcome %s to home page' % name) time.sleep(1) index() home('egon')