装饰器、装饰器的语法糖和有参装饰器~
装饰器、装饰器的语法糖和有参装饰器~
一、装饰器
(1)什么是装饰器
器=》工具
装饰=》指的是为被装饰对象添加新功能
装饰器本身可以是任意可调用的对象=》函数
被装饰器的对象也可以是任意可调用的对象=》函数
目标:写一个函数来为另外一个函数添加新功能
(2)为何要用装饰器
开放封闭原则:软件一旦上线就应该对修改封闭,对扩展开放
对修改封闭:
1、不能修改功能的源代码
2、也不能修改功能的调用方式
对扩展开放:
可以为原有的功能添加新的功能
装饰器就是要在不修改功能源代码以及调用方式的前提下为原功能添加额外新的功能
(3)如何用装饰器
import time
def index():
print('welcome to index page')
time.sleep(3)
return 123
def home(name):
print('welcome %s to home page'%name)
time.sleep(1)
def outter(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
stop = time.time()
print('run time is %s'%(stop-start))
return wrapper
index = outter(index)
home = outter(home)
index()
home('egon')
二、 装饰器的语法糖
@装饰器的名字:要在被装饰对象正上方单独一行写上
import time
def timmer(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
stop = time.time()
return res
return wrapper
@timmer #装饰器语法糖
def index():
print('welcome to index page~')
time.sleep(3)
return 123
@timmer #装饰器语法糖
def home(name):
print('welcome %s to home page~'%name)
home('egon')
index()
三、有参装饰器
模板:
def ouuter2(xxx,yyy)
def outter(func):
def wrapper(*args,**kwargs)
res = func(*args,**kwargs)
print(xxx)
print(yyy)
return res
return wrapper
return outter
案例:
import time
user_info={'current_user':None}
def auth2(engine = 'file'):
def auth(func):
def wrapper(*args,**kwargs):
if user_info['current_user'] is not None:
res = func(*args,**kwargs)
return res
inp_user = input('username>>:').strip()
inp_pwd = input('password>>:').strip()
if engine == 'file':
print('基于文件的认证')
if inp_user == 'egon' and inp_pwd == '123':
user_info['current_user'] = inp_user
print('login successful~')
res = func(*args,**kwargs)
return res
else:
print('user or password error!~')
elif engine == 'mysql':
print('基于mysql数据的认证')
elif engine == 'ldap':
print('基于ldap数据的认证')
else:
print('无法识别认证源')
return wrapper
return auth
@auth2(engine = 'mysql')
def index()
'''这是index功能'''
print('welcome to index page')
time.sleep(2)
return 123
@auth2(engine = 'file')
def home(name):
'''这是home功能'''
print('welcome %s to home page'%name)
time.sleep(1)
index()
home('egon')