python 之 函数 装饰器
Posted mylu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 之 函数 装饰器相关的知识,希望对你有一定的参考价值。
5.8 装饰器
1 开放封闭原则 软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的 也就是说我们必须找到一种解决方案: 能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能 原则如下: 1、不修改源代码 2、不修改调用方式 目的: 在遵循1和2原则的基础上扩展新功能
装饰器: 装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能,装饰器与被装饰的对象均可以是任意可调用的对象
装饰器 ===》函数 被装饰的对象 ===》函数
5.81 无参装饰器举例
import time
def index():
time.sleep(3)
print(‘welcome to index page‘)
def outter(func): #func=最原始的index
def wrapper():
start_time=time.time()
func()
stop_time=time.time()
print(stop_time-start_time)
return wrapper
?
index=outter(index) # 新的index=wrapper
index() #wrapper()
welcome to index page
3.0000429153442383
5.82 无参装饰器升级
import time
def index():
time.sleep(1)
print(‘welcome to index page‘)
return 122
def home(name):
time.sleep(2)
print(‘welcome %s to home page‘ %name)
#==============装饰器
def timmer(func): #func=最原始的index
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs) #调用最原始的index
stop_time=time.time()
print(stop_time-start_time)
return res
return wrapper
?
index=timmer(index) # 新的index=wrapper
home=timmer(home) #新的home=wrapper
# ==========================================
?
res=index() #res=wrapper()
print(res)
res=home(name=‘egon‘) #res=wrapper(name=‘egon‘)
print(res)
5.83 无参装饰器模板:
def index():
pass
#==============装饰器
def outer(func):
def inner(*args,**kwargs):
res=func(*args,**kwargs)
return res
return inner
?
index=outer(index)
# ==========================================
res=index()
print(res)
使用:在被装饰对象正上方单独一行,@无参装饰器名
5.84 装饰器语法糖
import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print(stop_time-start_time)
return res
return wrapper
?
5.85 叠加装饰器
import time
current_user=
‘username‘:None,
?
def auth(func): # func=index
def wrapper(*args,**kwargs):
if current_user[‘username‘]:
print(‘已经登陆过了‘)
res=func(*args,**kwargs)
return res
uname=input(‘用户名>>: ‘).strip()
pwd=input(‘密码>>: ‘).strip()
if uname == ‘egon‘ and pwd == ‘123‘:
print(‘登陆成功‘)
current_user[‘username‘]=uname
res=func(*args,**kwargs)
return res
else:
print(‘用户名或密码错误‘)
return wrapper
?
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print(stop_time-start_time)
return res
return wrapper
?
5.86 有参装饰器
import time
current_user=
‘username‘:None
def auth(engine): # engine=‘file‘ #添加一层函数传engine值
def auth2(func): # func=index
def wrapper(*args,**kwargs):
if engine == ‘file‘:
if current_user[‘username‘]:
print(‘已经登陆过了‘)
res=func(*args,**kwargs)
return res
uname=input(‘用户名>>: ‘).strip()
pwd=input(‘密码>>: ‘).strip()
if uname == ‘egon‘ and pwd == ‘123‘:
print(‘登陆成功‘)
current_user[‘username‘]=uname
res=func(*args,**kwargs)
return res
else:
print(‘用户名或密码错误‘)
elif engine == ‘mysql‘:
print(‘基于MyQL的认证‘)
elif engine == ‘ldap‘:
print(‘基于LDAP的认证‘)
return wrapper
return auth2
#auth_src=auth(‘ldap‘)
#@auth_src
?
5.87 有参装饰器模板
def outter2(x,y,z):
def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
return outter
使用:在被装饰对象正上方单独一行,@有参装饰器名(1,2,3)
以上是关于python 之 函数 装饰器的主要内容,如果未能解决你的问题,请参考以下文章