python中装饰器有哪些作用
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要为大家展示了"python中装饰器有哪些作用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"python中装饰器有哪些作用"这篇文章吧。pyth
千家信息网最后更新 2025年02月02日python中装饰器有哪些作用
这篇文章主要为大家展示了"python中装饰器有哪些作用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"python中装饰器有哪些作用"这篇文章吧。
python装饰器
python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
一般而言,我们要想拓展原来函数代码,最直接的办法就是侵入代码里面修改,但是最简单的方式并不是最安全最合适的方式,根据扩展开放修改封闭的原则,修改原函数代码是不可取的.比如下面的有一个案例:
A公司有一个核心接口部门M提供核心业务接口,有三个业务部门(N,W,Z)需要调用核心业务接口,在正常运行了一年后,公司规范接口调用需要验证用户权限进行接口调用,现在需要实现这个扩展功能如何在花费最小成本完成?
样例代码如下:
############### 核心接口部门 ###############def f1(): print('f1')def f2(): print('f2')def f3(): print('f3')def f4(): print('f4')############### 业务部门N 调用核心接口提供的功能 ###############f1()f2()f3()f4()############### 业务部门W 调用核心接口提供的功能 ###############f1()f2()f3()f4()############### 业务部门Z 调用核心接口提供的功能 ###############f1()f2()f3()f4()
.核心接口部门重构原函数,添加验证代码
############### 核心接口部门 ###############def verify(): print('验证代码')def f1(): verify() print('f1')def f2(): verify() print('f2')def f3(): verify() print('f3')def f4(): verify() print('f4')
分析:违反了开放封闭原则!对扩展是开放的,对修改封闭。对于核心的功能写好之后是不应许进入到功能里面去修改的。如果有1000个接口,你就得改一千次,虽然对于调用者无感,但核心接口部门成本很高。
核心接口部门扩展验证接口,业务部门调用时验证
############### 核心接口部门 ###############def verify(): print('验证代码')def f1(): print('f1')def f2(): print('f2')def f3(): print('f3')def f4(): print('f4')############### 业务部门N 调用核心接口提供的功能 ###############if(verify()){f1()f2()f3()f4()} else { print('未通过验证')}############### 业务部门W 调用核心接口提供的功能 ###############if(verify()){f1()f2()f3()f4()} else { print('未通过验证')}############### 业务部门Z 调用核心接口提供的功能 ###############if(verify()){f1()f2()f3()f4()} else { print('未通过验证')}
分析:
上述代码满足开放封闭原则。核心接口部门也是只要扩展一个验证功能即可,但业务调用部门需要进行验证功能调用,这不利于调用者使用。
核心接口装饰器进行验证,业务部门无感
############### 核心接口部门 ###############def verify(func): def inner(): # 验证1 # 验证2 # 验证3 return func() return inner@verifydef f1(): print('f1')@verifydef f2(): print('f2')@verifydef f3(): print('f3')@verifydef f4(): print('f4')
分析:
上述装饰器解决验证问题,只要核心接口部门进行操作,并且满足开放封闭原则。下面以f1为例,执行verify函数,并将 @verify 下面的 函数 作为verify函数的参数,即:@verify 等价于verify(f1)所以,内部就会去执行:def inner: #验证 return f1() # func是参数,此时 func 等于 f1return inner # 返回的 inner,inner代表的是函数,非执行函数 其实就是将原来的 f1 函数塞进另外一个函数中 将执行完的 verify 函数返回值赋值给@verify下面的函数的函数名 verify函数的返回值是: def inner: #验证 return 原来f1() # 此处的 f1 表示原来的f1函数 然后,将此返回值再重新赋值给 f1,即: 新f1 = def inner: #验证 return 原来f1() 所以,以后业务部门想要执行 f1 函数时,就会执行 新f1 函数, 在 新f1 函数内部先执行验证,再执行原来的f1函数,然后将 原来f1 函数的返回值 返回给了业务调用者。 如此一来, 即执行了验证的功能,又执行了原来f1函数的内容,并将原f1函数返回值 返回给业务调用着。
扩展
上面我们写的是没有带参数的,我们如何写带参数的呢?
带一个参数
def verify(func): def inner(arg1): # 验证1 # 验证2 # 验证3 return func(arg1) return inner@verifydef f1(arg1): print('f1')
备注:如果你要指定参数个数,就添加指定个数参数到里面即可。如下:
带两个参数
def verify(func): def inner(arg1,arg2): # 验证1 # 验证2 # 验证3 return func(arg1,arg2) return inner@verifydef f1(arg1,arg2): print('f1')
带N个参数
def verify(func): def inner(*args,**kwargs): # 验证1 # 验证2 # 验证3 return func(*args,**kwargs) return inner@verifydef f1(arg1,arg2,arg3,arg4,arg5): print('f1')
一个函数可以有多个装饰器
def w1(func): def inner(*args,**kwargs): # 验证1 # 验证2 # 验证3 return func(*args,**kwargs) return innerdef w2(func): def inner(*args,**kwargs): # 验证1 # 验证2 # 验证3 return func(*args,**kwargs) return inner@w1@w2def f1(arg1,arg2,arg3): print 'f1'
以上是"python中装饰器有哪些作用"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
验证
函数
接口
部门
核心
业务
功能
代码
参数
开放
内容
原则
就是
中装
作用
用者
篇文章
面的
分析
个数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
河南软件开发参考价格
如何给小孩普及网络安全
怎样用云服务器做云盘
数据库db和mdb的区别
外卖系统软件开发
怎么过网络技术三级
软件开发 软件测试工资
数据库索引分为几种怎样使用
联通校园网服务器地址
数据库分析专业课程
php服务器维护
网络安全与硬件维护管理岗位
dnf服务器80m版本
软件开发热修什么意思
分布式服务器什么意思
前端软件开发师
联想塔式服务器怎么用
共同服务器
网络安全手抄报获奖作品
广东银联网络技术服务单价
软件开发合同质保
软件开发网络直播平台
服务器禁止国外ip
无锡一站式软件开发记录
ibm服务器感叹号灯
上海教育网络安全管理平台
肖志光谈网络技术
bak数据库恢复
北京亿览网络技术有限公司
网络安全禁毒知识竞赛