H5W3
当前位置:H5W3 > python > 正文

【Python】python装饰器

python装饰器

宫隅仁太发布于 18 分钟前

装饰器内核

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函数装饰器的分享就到这里啦,还请务必亲自写代码实践!

python装饰器
阅读 16发布于 18 分钟前
本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
avatar

宫隅仁太

为自己学过的东西写一点文章记录一下~

1 声望
0 粉丝

0 条评论
得票时间

avatar

宫隅仁太

为自己学过的东西写一点文章记录一下~

1 声望
0 粉丝

宣传栏

装饰器内核

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函数装饰器的分享就到这里啦,还请务必亲自写代码实践!

本文地址:H5W3 » 【Python】python装饰器

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址