一、什么叫装饰器?
器 便是专用工具 可以用函数界定
装饰设计 为别的事情加上功能
合到一起能够 了解成是界定一个函数来装饰设计别的函数。给别的函数加上附加的功能 。
装饰器 的应用考虑对外开放封闭式标准
即针对编码功能的扩展是对外开放的
针对改动源码是封闭式的
合到一起便是不可以改函数的启用方法 ,和原函数的编码,可是要增加原函数的功能。
二 、装饰器如何界定?
from functools import wraps
def outter(func):
@wraps(func) # 将wrapper函数伪装成func函数的专用工具,除开返回值 ,主要参数之外,包含func的内嵌特性__name__,__file__这些都伪装成一样的。
def wrapper(*args,**kwargs): # 保证wrapper的主要参数 ,返回值,启用方法都跟func一模一样,可是能够 增加一些功能
# 功能能够 增加在这儿
res = func(*args,**kwargs)
return res
return wrapper
==============================> 下边是函数的启用环节啦
func = outter(func) # 返回值便是wrapper函数的内存地址 ,以后再再加括弧就可以完成不在更改func函数的替代方法 ,和编码的状况下,完成针对func功能的增加 。这就是无参装饰器的模版啦!
python让我们出示了语法糖,准予大家将func = outter(func) 那样的句子 ,缩写成
@outter # 在被装饰设计的函数上边申明装饰器就可以完成为函数再加功能,能够 制做一些验证装饰器,時间装饰器 ,这些
def func(*args,**kwargs):
pass
==================================================》 下边是有参装饰器啦~
from functools import wraps
def code(x):
def outter(func):
@wraps(func)
def wrapper(*args,**kwargs): # 保证wrapper的主要参数,返回值,启用方法都跟func一模一样 ,可是能够 增加一些功能
# 功能能够 增加在这儿
res = func(*args,**kwargs)
return res
return wrapper
return outter
==============================> 下边是函数的启用环节啦
受语法糖的限定,我们不能再outter函数中在增加主要参数了,可是假如的确也有必须传进去的自变量主要参数呢 ,我们可以根据再嵌套循环一层的方式 给函数传参。
outter = code(x)
无参装饰器时语法糖是 将 func = outter(func) ---> 简单化成 ---> @outter
如今outter 便是 code(x) -----------------------------------------------> @code(x) 这就是有参的装饰器啦~,这儿传X仅仅一个事例,实际上能够 传不分的主要参数。
三、怎么使用装饰器
1.界定一个测算函数运作時间的装饰器
from functools import wraps
import time
def timmer(func):
@wraps(func)
def wrapper(*args,**kwargs): # 保证wrapper的主要参数,返回值 ,启用方法都跟func一模一样 ,可是能够 增加一些功能
# 功能能够 增加在这儿
start = time.time
res = func(*args,**kwargs)
end = time.time
print(f‘实行函数用时start-end秒’)
return res
return wrapper
1.界定一个验证功能的装饰器
from functools import wraps
def auth(func):
@wraps(func)
def wrapper(*args,**kwargs): # 保证wrapper的主要参数,返回值,启用方法都跟func一模一样 ,可是能够 增加一些功能
# 功能能够 增加在这儿
user_name = input('登录名>>>:‘)
psd = input('登陆密码>>>:')
# 从文件查找登录名和登陆密码验证
f = open('a.txt')
for line in f:
if user_name.split().lower() in line.lower and psd in line:
res = func(*args,**kwargs)
return res
else:
print('登录失败')
return wrapper
文章来源于网络,如有侵权请联系站长QQ61910465删除本文版权归趣快排营销www.SEOguruBLOG.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ㊣61910465