共计 1872 个字符,预计需要花费 5 分钟才能阅读完成。
装璜器内核
python 装璜器的内核其实是将函数作为参数传递到另一个函数体外部,也就是说在该函数执行前优先执行装璜器函数,利用场景包含用户验证,日志撰写,数据验证等等,能够防止多段的反复代码,晋升代码的可复用性。接下来将由浅入深的介绍三种以函数作为装璜器的根本模式。
不带参数的装璜器
先上代码
# 不带参数的装璜器
def func_name(func):
def inner():
print('decorator called')
func()
return inner
@func_name
def s1():
print('s1 called')
s1() #开始执行
#--------------- 执行后果 -------------------
#decorator called
#s1 called
解说一下这段代码,代码执行入口为 s1()
,此时解释器接触到了func_name
装璜器,于是此时 s1()
函数暂停执行,将 s1
作为一个参数带入到装璜器函数,解释器开始执行 func_name(s1)()
,依据func_name
函数定义,执行函数inner()
,因而首先打印decorator called, 继续执行会打印s1 called。从而实现了在函数执行前先做一部分工作。
带参数的装璜器
接下来做一个用户验证的示例来解说,设想这样一个场景,零碎登录时,如果用户名明码正确那么能够进入零碎,否则就回绝进入,因而用户验证是零碎登陆这样一个性能之前必须经验的一个步骤。代码如下
# 带参数的装璜器
def dec(func):
def inner(*args,**kwargs): #s2 参数传递
print('开始装璜')
if kwargs.get('user')=='root' and kwargs.get('password')=='dlut':
print('验证通过')
func(*args,**kwargs) #执行 s2()
else:
print('验证不通过') #不执行 s2()
return inner
@dec
def s2(*args,**kwargs):
print('开始求和,打印关键词~')
print(sum(args))
print(kwargs)
s2(3,6,8,user='root',password='dlut') #函数入口
#--------------- 执行后果 -------------------
#开始装璜
#验证通过
#开始求和,打印关键词~
#17
#{'user': 'root', 'password': 'dlut'}
同理,执行带参数的 s2()
函数时,遇到 dec
装璜器,将参数传递到装璜器外部定义的 inner()
函数中,从而能够获取相干参数进行用户验证。
装璜带返回值的函数
装璜具备返回值的函数应该怎么做呢,话不多说,代码如下
# 装璜带返回值的函数
def dec2(func):
def inner(*args):
print('开始装璜~')
ret=func(*args)
return ret #此处返回 func_run 函数的返回值即可
return inner
@dec2
def func_run(*args):
return sum(args)
_sum=func_run(1,4,6) #函数入口
print('求和后果',_sum)
#--------------- 执行后果 -------------------
#开始装璜~
#求和后果 11
类用作润饰器
接下来给大家分享一段代码,对于类用作润饰器,它的性能是,通过润饰器实现用户验证,若验证胜利则继续执行函数,否则间接返回False
# 类用作润饰器
print('-------------------------')
class Dec_obj(object):
def __init__(self,func):
self._func=func
pass
def __call__(self, *args, **kwargs):
print('dec called')
if kwargs.get('user')=='mark' and kwargs.get('password')=='wo4xuhao':
return self._func(*args,**kwargs)
else:
return False
@Dec_obj
def func(*args, **kwargs):
print('func entered')
return sum(args)
print(func(2,6,9,user='mark',password='wo4xuhao'))
对于 python 函数装璜器的分享就到这里啦,还请务必亲自写代码实际!
正文完