百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

在 Python 中使用设计模式:你还在编写面向过程的代码吗?

haoteby 2024-12-29 03:19 6 浏览

Python 作为一种非常流行的编程语言,易学、灵活、功能强大,被广泛应用于各个领域。然而,很多人认为 Python 是一种面向过程的语言,不能很好地支持面向对象的编程风格。

这种想法是错误的,因为 Python 不仅支持面向对象编程,还能很好地应用设计模式。

什么是设计模式?

设计模式是一套广为接受且行之有效的编程经验。它提供了一套可应用于各种编程场景的通用解决方案。设计模式的出现是为了解决软件开发中的一些常见问题,如代码重用、系统可扩展性、代码可读性等。

为什么要使用设计模式?

使用设计模式的好处如下:

代码重用:通过使用设计模式,可以对代码进行分解和组合,从而实现代码重用。

  • 系统的可扩展性:设计模式可以使系统更加灵活、易于扩展,并能适应不同的需求。
  • 代码可读性:使用设计模式可以提高代码的可读性,使代码更加清晰。

Python 中的设计模式

Python 中的设计模式与其他语言中的设计模式相似,但也有一些不同之处。Python 中的设计模式可分为三类:创建型模式结构型模式和行为模式。

本文将介绍其中一些常见的模式。

工厂模式

工厂模式是一种创建模式,提供了创建对象的最佳方法。工厂模式将对象的创建和使用分开,使对象的创建更加灵活。

在 Python 中,你可以使用工厂模式创建各种对象,例如:

这段代码展示了工厂模式的一个简单实现:

  1. 首先定义了两个类 DogCat,它们都有一个 __init__ 方法,用于初始化 name 属性。
  2. AnimalFactory 类是一个工厂类,它有一个 create_animal 方法,根据传入的 animal_type 参数创建并返回相应的动物对象。
  3. create_animal 方法中: 如果 animal_type"dog",返回一个 Dog 实例;如果 animal_type"cat",返回一个 Cat 实例;如果是其他类型,返回 None
  4. 代码最后创建了一个 AnimalFactory 实例 factory
  5. 使用 factory.create_animal("dog") 创建了一个 Dog 实例,并将其赋值给 animal 变量。
  6. 最后打印 animal.name,输出结果为 "dog"

这种模式的优点是,客户端代码不需要知道具体的 DogCat 类,只需要通过工厂类来创建所需的对象。这样可以降低代码的耦合度,使系统更容易扩展和维护。例如,如果将来需要添加新的动物类型,只需在 AnimalFactory 中添加相应的逻辑,而不需要修改使用工厂的客户端代码。

单例模式

单例模式是一种创建模式,可确保一个类只有一个实例,并提供一个全局访问点。

在 Python 中,你可以使用装饰器来实现单例模式:

这段代码实现了单例模式(Singleton Pattern)在Python中的一种实现方式:

  1. Singleton 类定义: 类变量 __instance 初始化为 None,用于存储唯一的实例。
  2. __new__ 方法: 这是Python中创建对象时首先调用的方法,用于控制实例的创建。 如果 cls.__instanceNone(即还没有创建实例),则创建一个新实例并赋值给 cls.__instance。 如果 cls.__instance 已经存在,直接返回已存在的实例。
  3. 创建实例: a = Singleton()b = Singleton() 看似创建了两个实例。
  4. 比较结果: print(a is b) 输出 True,说明 ab 实际上是同一个对象。
  5. 工作原理: 第一次调用 Singleton() 时,创建了一个新实例并存储在 __instance 中。 之后的每次调用都返回这个已存在的实例,而不是创建新的。
  6. 单例模式的目的: 确保一个类只有一个实例,并提供一个全局访问点。 常用于需要协调整个系统行为的场景,如配置管理、日志记录等。

这种实现方式保证了无论创建多少次 Singleton 类的实例,实际上都是同一个对象,从而实现了单例模式的核心思想。

适配器模式

适配器模式是一种结构型模式,它允许将一个类的接口转换成客户希望的另一个接口。我们可以通过类比来解释适配器模式:适配器就像是插座转换器。比如,你有一个欧洲的插头(Adaptee),但你要在美国的插座上使用(Target)。插头的形状和插座不匹配,这时你需要一个插座转换器(Adapter)来使它们兼容。见下面的代码:

  • Target 类定义了客户端期望的接口(在这个例子中是 request 方法),但没有具体实现。这个类是一个抽象类或接口,表示客户端(比如美国的插座)需要的方法。换句话说,Target 就是客户端希望的标准接口。
  • Adaptee 类是现有的类,它拥有一个客户端不期望的接口方法 specific_request。在我们的类比中,Adaptee 就像是欧洲的插头,它的接口与美国插座不匹配,不能直接使用。
  • Adapter 类继承了 Target 类,表示它要实现客户端期望的接口。在适配器模式中,Adapter 的任务就是将客户端期望调用的 request 方法,转换为 Adaptee 中已经存在的 specific_request 方法。Adapter 的构造方法接收一个 Adaptee 对象作为参数,然后在 request 方法中调用 Adapteespecific_request,这样客户端就可以通过 request 方法来使用 specific_request
  • 客户端代码:先创建了一个 Adaptee 对象,表示现有的接口实现(比如欧洲插头)。然后,我们创建一个 Adapter 对象,将 Adaptee 对象传入适配器。最后,客户端使用 adapter.request() 来调用 Adapteespecific_request 方法,而不需要直接处理 Adaptee 的接口。
  • 装饰器模式

    装饰器模式是一种结构模式,可动态地将新行为附加到对象上。

    在 Python 中,装饰器是一个特殊的函数,可以用来修改函数或类的行为,例如,修改一个函数或类的行为:

    观察者模式

    观察者模式是一种行为模式,它定义了对象之间一对多的关系,这样当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。

    例如,在 Python 中,您可以使用观察者模式来实现事件驱动编程:

    建造者模式

    将复杂对象的构造与表示分离开来,允许用相同的构造过程创建不同的表示。

    Director 使用 Builder 接口来指导建造过程。具体的构建器(如 CarBuilder)通过实现该接口来创建特定的产品(Car)。客户端代码(director.construct_car(car_builder))并不知道具体的生成器实现。

    战略模式

    定义一系列算法,对每种算法进行封装,并使它们可以互换。该策略可使算法独立于使用它的客户端而变化。

    PaymentContext 类包含对支付策略的引用。客户端可以在不同的支付策略(如 CreditCardPaymentPayPalPayment)之间切换,而无需修改客户端代码。

    责任链模式

    沿处理程序链传递请求。收到请求后,每个处理程序都会决定处理该请求或将其传递给链中的下一个处理程序。

    处理程序(如 ConcreteHandlerAConcreteHandlerB)形成一个链,每个处理程序决定是处理请求还是将其传递给下一个处理程序。客户端(Client)通过链发起请求。

    总结

    Python 不仅是一种过程式语言,它还支持面向对象的编程风格。通过使用设计模式,我们可以更好地利用 Python 的面向对象特性,使代码更灵活、更易读、更易维护。

    Python 中的设计模式包括工厂模式、单例模式、适配器模式、装饰器模式、观察者模式等。这些模式可应用于各种编程场景,有助于解决常见的软件开发问题。

    参考资料

    https://refactoring.guru/design-patterns

    相关推荐

    wordpress集团公司网站模板:XSgr

    小兽wordpress推出一款高端集团公司主题,打造高品质官网。高端是一种态度和坚持,因为我坚信贴合产品及品牌理念的高端深度定制才能最大化地呈现企业的务实严谨与产品的专业品质相比,某种程度上讲–...

    宝塔搭建WordPress跨境电商外贸商城模板汉化woodmart7.5.1源码

    大家好啊,欢迎来到web测评。本期给大家带来一套php开发的WoodmartV7.5.1汉化主题|跨境电商|外贸商城|产品展示网站模板WordPress主题,是wordpress开发的。上次是谁要的系...

    Wordpress建站设计技巧:用好Wordpress自带样板功能

    作者:悦然wordpress建站(悦然建站)...

    微软推出Azure平台WordPress模板:分分钟搭建博客

    IT之家讯微软Azure云服务平台可以托管各种各样的Web服务,从企业应用后端服务到视频托管服务等等。WordPress是目前最为流行的博客平台,驱动着全球1/4的互联网网站。不过用户想要在Azur...

    wordpress公司展示型通用模板:XShw

    主题介绍xshw公司模板是一款现代化风格、通用型公司展示的Wordpress公司建站模板,采用经典的颜色搭配、精致的模块布局、完善的列表模板、响应式自适应技术以及配置的大幅全屏轮播图、公司简介、业务介...

    WP模板开发中,怎样给wordpress网站的文章,添加点赞功能?

    我们在网上浏览某些网站的文章时,在文章的结尾处,都会有一个点赞的按钮,如果觉得文章内容非常不错,就可以点击这个“点赞”按钮,给这篇文章进行点赞一下。在wordpress网站的模板主题开发中,我们可不可...

    免费的WordPress模板

    免费的WordPress模板有很多种类,适用于不同类型的网站需求。以下是一些推荐的免费WordPress模板,它们各具特色,适合多种用途:...

    东港边检站开展全面清理自制执勤执法证件表单专项工作

    为进一步提高边检机关依法行政和服务管理水平,根据部局和总站统一部署,6月3日下午,东港边检站迅速开展全面清理自制执勤执法证件表单专项工作。一是统一思想,提高认识。该站于6月3日召开专题会议,传达部局视...

    两款超级好用的二维码生成器软件,铁铁们快码住

    今天分享两款超级好用的二维码生成器,个人认为衡量是否是好用的二维码生成器的主要有以下维度(仅从用户体验角度)...

    扫码填表如何拍摄现场照片?表单添加图片的二维码制作方法

    现在通过扫描二维码来登记信息的方式非常的常见,有很多的应用场景会使用这种方式来统计数据,比如问卷调查、用户反馈、巡检结果等类型。通过扫码填写信息后,制作者可以及时的获取对应的数据做出反馈。那么表单二维...

    纯干货∣教你如何制作一份具有法律效应的“电子合同”

    表单中使用电子合同时,不仅需要进行功能设置,还需要制作一份PDF格式的模板...

    金山表单硬核功能“在线考试”上线

    近日,金山文档针对教师用户群体上线“在线考试”考试功能。教育从业者可在金山文档内完成考试、练习测验、竞赛和作业布置。与此同时,该功能还具备自动批改计分、答案解析、成绩展示、信息收集等特色功能。充分适配...

    报名小程序怎么制作?借助这个报名表单工具一键搞定

    报名表单广泛应用于各类活动、课程、会议和招募等场景中,用于收集报名者的个人信息和参与意愿,方便组织者进行统计、管理和沟通。表单制作不需要写代码,学会借助线上报名表单工具就能一键搞定。...

    货代人的表单制作方式,该升级了!

    很多在货代行业工作的人可能会思考是否将销售岗位转为操作岗位,因为货代销售工作需要不断迎接业绩的挑战,每个月都要全力以赴,但绩效考核的结果并不总是确定的。...

    为你的WordPress widget建立表单

    通过之前的三部分教程我们已经创建了一个自己的WordPresswidget。今天我们将给大家介绍如何为你的widget创建表单,以至于WordPress可以及时的更新widget设置。为widget...