位置: 编程技术 - 正文

分析Python中设计模式之Decorator装饰器模式的要点(python在设计领域的应用)

编辑:rootadmin

推荐整理分享分析Python中设计模式之Decorator装饰器模式的要点(python在设计领域的应用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python 设计原则,python设计方案,python设计方案,python在设计领域的应用,python设计内容,python 设计原则,python 设计原则,python设计内容,内容如对您有帮助,希望把文章链接给更多的朋友!

先给出一个四人团对Decorator mode的定义:动态地给一个对象添加一些额外的职责。再来说说这个模式的好处:认证,权限检查,记日志,检查参数,加锁,等等等等,这些功能和系统业务无关,但又是系统所必须的,说的更明白一点,就是面向方面的编程(AOP)。在Python中Decorator mode可以按照像其它编程语言如C++, Java等的样子来实现,但是Python在应用装饰概念方面的能力上远不止于此,Python提供了一个语法和一个编程特性来加强这方面的功能。Python提供的语法就是装饰器语法(decorator),如下:

装饰模式强调动态地给对象添加额外的功能。 Python内置了很多对装饰器的支持,因此在Python中使用装饰模式是非常容易的,下面是一个典型的例子,给函数增加日志功能:

functools.wraps是Python标准库提供的一个特殊的装饰器,用来解决装饰器带来的一些常规问题,如函数名称、doc等的不一致问题。@是Python针对装饰器提供的一个语法糖,上面的@log_wrapper相当于wrap_test = log_rapper(test),用@后,这个步骤由解释器代劳了。

装饰器是Python编程必须掌握的一项技能,在编码过程中经常会用到。

分析Python中设计模式之Decorator装饰器模式的要点(python在设计领域的应用)

这里只是一个普通的内嵌函数

而下面boo则是一个闭包

boo的特殊性在于引用了外部变量b,当aoo返回后,只要返回值(boo)一直存在,则对b的引用就会一直存在。上面的知识可能需要花些时间消化,如果你觉得已经掌握了这些知识,下面就回归正题,看看这些语言特性是怎样来实现Python中装饰的概念的。还是让我们先看一个简单的例子,然后逐步深入。这个例子就是加锁,怎样实现加锁的功能?具体需求是这样的:我有一个对象,实现了某些功能并提供了一些接口供其它模块调用,这个对象是运行在并发的环境中的,因此我需要对接口的调用进行同步,第一版的代码如下:

这版代码的问题很明显,那就是每个接口函数都有相同的加锁/解锁代码,重复的代码带来的是更多的键入,更多的阅读,更多的维护,以及更多的修改,最主要的是,程序员本应集中在业务上的的精力被分散了,而且请注意,真正的业务代码在距离函数定义2次缩进处开始,即使你的显示器是宽屏,这也会带来一些阅读上的困难。你直觉的认为,可以把这些代码收进一个函数中,以达到复用的目的,但是请注意,这些代码不是一个完整同一的代码块,而是在中间嵌入了业务代码。现在我们用装饰器语法来改进这部分代码,得到第2版代码:

一个装饰器函数的第一个参数是所要装饰的那个函数对象,而且装饰器函数必须返回一个函数对象。如sync函数,当其装饰interface1时,参数func的值就是interface1,返回值是wrapper,但类Foo实例的interface1被调用时,实际调用的是wrapper函数,在wrapper函数体中间接调用实际的interface1;当interface2被调用时,也调用的是wrapper函数,不过由于在装饰时func已经变成interface2,所以会间接地调用到实际的interface2函数。使用装饰器语法的好处:代码量大大的减少了,更少的代码意味着更少的维护,更少的阅读,更少的键入,好处不一而足(可复用,可维护)用户基本上将绝大部分精力放在了业务代码上,而且少了加减锁的代码,可读性也提高了缺点:业务对象Foo中有一个非业务数据成员lock,很碍眼;相当程度的耦合,wrapper的第一个参数必须是对象本身,而且被装饰的对象中必须有一个lock对象存在,这给客户对象添加了限制,使用起来不是很舒服。我们可以更进一步想一想:lock对象必须要放在Foo中吗?为每个接口函数都键入@sync还是很烦人的重复性人工工作,如果漏添加一个,还是会造成莫名其妙的运行时错误,为什么不集中处理呢?为了解决上述的缺点,第3版代码如下:

对对象的功能装饰是一个更一般的功能,不仅限于为接口加锁,我用2个类来完成这一功能,DecorateClass是一个基类,只定义了遍历并应用装饰功能的算法代码(template method),LockerDecorator实现了为对象加锁的功能,其中iter是迭代器,定义了怎样遍历对象中的成员(包括数据成员和成员函数),filter是过滤器,定义了符合什么规则的成员才能成为一个接口,operate是执行函数,具体实施了为对象接口加锁的功能。而在业务类Foo的__init__函数中,只需要在最后添加一行代码:LockerDecorator(self).decorate(),就可以完成为对象加锁的功能。如果你的对象提供的接口有特殊性,完全可以通过直接改写filter或者继承LockerDecorator并覆盖filter的方式来实现;此外,如果要使用其他的装饰功能,可以写一个继承自DecorateClass的类,并实现iter,filter和operate三个函数即可。

Python设计模式编程中解释器模式的简单程序示例分享 模式特点:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。我们来看一下下面这样的程序

详解Python设计模式编程中观察者模式与策略模式的运用 观察者模式观察者模式:又叫发布订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变

Python使用设计模式中的责任链模式与迭代器模式的示例 责任链模式责任链模式:将能处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理请求为止,避免请求的发送者和接收者之间

标签: python在设计领域的应用

本文链接地址:https://www.jiuchutong.com/biancheng/383370.html 转载请保留说明!

上一篇:Python随机生成带特殊字符的密码(python生成随机数表)

下一篇:Python设计模式编程中解释器模式的简单程序示例分享(python设计程序)

  • 预收货款需要缴纳消费税吗?缴纳消费税的时间应该是?
  • 企业纳税申报表怎么查询
  • 企业技术转让享受税收优惠政策应符合哪些条件
  • 个体工商户需要交税吗?怎么交?
  • 购买财务软件如何做凭证
  • 产品成本计算的基本方法和辅助方法的划分标准是
  • 公司收到劳务发票
  • 用票据付款怎么做账
  • 工资没走公账走的私人账户合法吗
  • 公司购车预计净残值率怎么计算
  • 外资企业订单外放,员工待岗合法吗
  • 收到电子银行承兑汇票的账务处理
  • 企业运费发票需要缴纳印花税吗附政策依据
  • 以前年度少计费用,调整分录
  • 订单式生产管理
  • 口腔医院的发票有什么用
  • 提成工资可以扣发吗?
  • 营改增后哪些费用可以抵扣
  • 用现金缴纳海关增值税能否抵扣?
  • 自然人借款给企业的涉税风险
  • 小微企业一季度30万免税
  • 什么时候计提减值
  • 企业所得税怎么征收
  • 咨询费属于什么大类
  • 支付征地补偿款怎么开具增值税发票
  • 电脑找不到休眠设置了
  • linux怎么翻译
  • 生产车间机器设备日常维修
  • 融资租赁税费计算
  • 计算土地增值税时增值额的扣除项目包括
  • 应付债券的应付利息怎么计算
  • thinkphp多模块
  • php替换字符串中的某个字符
  • 衡量一个企业经营状况
  • 借款利息税前扣除需要发票
  • gpt3 transformer
  • 进入微信小程序
  • php image
  • 股票收益缴纳个人所得税吗
  • 应收票据包括哪些项目内容
  • 购进免税农产品进项税额计算
  • 上一年度企业所得税汇算清缴
  • 开票和不开票的销项税额怎么算
  • 增值税专用发票几个点
  • 在建工程账务处理会计分录
  • 交易性金融资产包括哪些项目
  • 房地产企业怎么预缴企业所得税
  • 管理人员工资结构
  • 应交税费减免税款怎么结转
  • 暂估应付账款借贷方向
  • 账本结转下年怎么划线
  • 支付中标服务费借款情况说明怎么写
  • 出口退税哪些商品不能退
  • 年底结账会计处理
  • mysql5.7.29安装
  • win8系统打开我的电脑就黑屏
  • Linux系统中管理员如何获得root权限
  • linux系统讲解
  • windows xp快捷键设置在哪
  • Win7系统怎么打开文件后缀名
  • win10如何移动应用程序
  • WIN10开始菜单点不动
  • 消除类策略游戏
  • nodejs读取json文件,并返回列表
  • nodejs创建vue
  • unity3d spine
  • 广度优先搜索输出路径
  • 简要说明javascript的作用
  • jquery keydown
  • 噩梦pv
  • qrcode怎么生成
  • android模拟器无法运行
  • 资源税包括哪些
  • 辽宁省电子税务局电话
  • 总局公告2011年第34号
  • 农业银行联行号查询系统官网
  • 浙江国税局电话客服热线
  • 丰台和朝阳中间是哪里
  • 企业投资项目备案表模板
  • 山东省税务局地税苑宿舍是谁开发的?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设