在 Python 中使用设计模式:你还在编写面向过程的代码吗?
haoteby 2024-12-29 03:19 13 浏览
Python 作为一种非常流行的编程语言,易学、灵活、功能强大,被广泛应用于各个领域。然而,很多人认为 Python 是一种面向过程的语言,不能很好地支持面向对象的编程风格。
这种想法是错误的,因为 Python 不仅支持面向对象编程,还能很好地应用设计模式。
什么是设计模式?
设计模式是一套广为接受且行之有效的编程经验。它提供了一套可应用于各种编程场景的通用解决方案。设计模式的出现是为了解决软件开发中的一些常见问题,如代码重用、系统可扩展性、代码可读性等。
为什么要使用设计模式?
使用设计模式的好处如下:
代码重用:通过使用设计模式,可以对代码进行分解和组合,从而实现代码重用。
- 系统的可扩展性:设计模式可以使系统更加灵活、易于扩展,并能适应不同的需求。
- 代码可读性:使用设计模式可以提高代码的可读性,使代码更加清晰。
Python 中的设计模式
Python 中的设计模式与其他语言中的设计模式相似,但也有一些不同之处。Python 中的设计模式可分为三类:创建型模式、结构型模式和行为型模式。
本文将介绍其中一些常见的模式。
工厂模式
工厂模式是一种创建模式,提供了创建对象的最佳方法。工厂模式将对象的创建和使用分开,使对象的创建更加灵活。
在 Python 中,你可以使用工厂模式创建各种对象,例如:
这段代码展示了工厂模式的一个简单实现:
- 首先定义了两个类 Dog 和 Cat,它们都有一个 __init__ 方法,用于初始化 name 属性。
- AnimalFactory 类是一个工厂类,它有一个 create_animal 方法,根据传入的 animal_type 参数创建并返回相应的动物对象。
- 在 create_animal 方法中: 如果 animal_type 是 "dog",返回一个 Dog 实例;如果 animal_type 是 "cat",返回一个 Cat 实例;如果是其他类型,返回 None
- 代码最后创建了一个 AnimalFactory 实例 factory。
- 使用 factory.create_animal("dog") 创建了一个 Dog 实例,并将其赋值给 animal 变量。
- 最后打印 animal.name,输出结果为 "dog"。
这种模式的优点是,客户端代码不需要知道具体的 Dog 或 Cat 类,只需要通过工厂类来创建所需的对象。这样可以降低代码的耦合度,使系统更容易扩展和维护。例如,如果将来需要添加新的动物类型,只需在 AnimalFactory 中添加相应的逻辑,而不需要修改使用工厂的客户端代码。
单例模式
单例模式是一种创建模式,可确保一个类只有一个实例,并提供一个全局访问点。
在 Python 中,你可以使用装饰器来实现单例模式:
这段代码实现了单例模式(Singleton Pattern)在Python中的一种实现方式:
- Singleton 类定义: 类变量 __instance 初始化为 None,用于存储唯一的实例。
- __new__ 方法: 这是Python中创建对象时首先调用的方法,用于控制实例的创建。 如果 cls.__instance 为 None(即还没有创建实例),则创建一个新实例并赋值给 cls.__instance。 如果 cls.__instance 已经存在,直接返回已存在的实例。
- 创建实例: a = Singleton() 和 b = Singleton() 看似创建了两个实例。
- 比较结果: print(a is b) 输出 True,说明 a 和 b 实际上是同一个对象。
- 工作原理: 第一次调用 Singleton() 时,创建了一个新实例并存储在 __instance 中。 之后的每次调用都返回这个已存在的实例,而不是创建新的。
- 单例模式的目的: 确保一个类只有一个实例,并提供一个全局访问点。 常用于需要协调整个系统行为的场景,如配置管理、日志记录等。
这种实现方式保证了无论创建多少次 Singleton 类的实例,实际上都是同一个对象,从而实现了单例模式的核心思想。
适配器模式
适配器模式是一种结构型模式,它允许将一个类的接口转换成客户希望的另一个接口。我们可以通过类比来解释适配器模式:适配器就像是插座转换器。比如,你有一个欧洲的插头(Adaptee),但你要在美国的插座上使用(Target)。插头的形状和插座不匹配,这时你需要一个插座转换器(Adapter)来使它们兼容。见下面的代码:
装饰器模式
装饰器模式是一种结构模式,可动态地将新行为附加到对象上。
在 Python 中,装饰器是一个特殊的函数,可以用来修改函数或类的行为,例如,修改一个函数或类的行为:
观察者模式
观察者模式是一种行为模式,它定义了对象之间一对多的关系,这样当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。
例如,在 Python 中,您可以使用观察者模式来实现事件驱动编程:
建造者模式
将复杂对象的构造与表示分离开来,允许用相同的构造过程创建不同的表示。
Director 使用 Builder 接口来指导建造过程。具体的构建器(如 CarBuilder)通过实现该接口来创建特定的产品(Car)。客户端代码(director.construct_car(car_builder))并不知道具体的生成器实现。
战略模式
定义一系列算法,对每种算法进行封装,并使它们可以互换。该策略可使算法独立于使用它的客户端而变化。
PaymentContext 类包含对支付策略的引用。客户端可以在不同的支付策略(如 CreditCardPayment 或 PayPalPayment)之间切换,而无需修改客户端代码。
责任链模式
沿处理程序链传递请求。收到请求后,每个处理程序都会决定处理该请求或将其传递给链中的下一个处理程序。
处理程序(如 ConcreteHandlerA 和 ConcreteHandlerB)形成一个链,每个处理程序决定是处理请求还是将其传递给下一个处理程序。客户端(Client)通过链发起请求。
总结
Python 不仅是一种过程式语言,它还支持面向对象的编程风格。通过使用设计模式,我们可以更好地利用 Python 的面向对象特性,使代码更灵活、更易读、更易维护。
Python 中的设计模式包括工厂模式、单例模式、适配器模式、装饰器模式、观察者模式等。这些模式可应用于各种编程场景,有助于解决常见的软件开发问题。
参考资料
https://refactoring.guru/design-patterns
相关推荐
- 一日一技:用Python程序将十进制转换为二进制
-
用Python程序将十进制转换为二进制通过将数字连续除以2并以相反顺序打印其余部分,将十进制数转换为二进制。在下面的程序中,我们将学习使用递归函数将十进制数转换为二进制数,代码如下:...
- 十进制转化成二进制你会吗?#数学思维
-
六年级奥赛起跑线:抽屉原理揭秘。同学们好,我是你们的奥耀老师。今天一起来学习奥赛起跑线第三讲二进制计数法。例一:把十进制五十三化成二进制数是多少?首先十进制就是满十进一,二进制就是满二进一。二进制每个...
- 二进制、十进制、八进制和十六进制,它们之间是如何转换的?
-
在学习进制时总会遇到多种进制转换的时候,学会它们之间的转换方法也是必须的,这里分享一下几种进制之间转换的方法,也分享两个好用的转换工具,使用它们能够大幅度的提升你的办公和学习效率,感兴趣的小伙伴记得点...
- c语言-2进制转10进制_c语言 二进制转十进制
-
#include<stdio.h>intmain(){charch;inta=0;...
- 二进制、八进制、十进制和十六进制数制转换
-
一、数制1、什么是数制数制是计数进位的简称。也就是由低位向高位进位计数的方法。2、常用数制计算机中常用的数制有二进制、八进制、十进制和十六进制。...
- 二进制、十进制、八进制、十六进制间的相互转换函数
-
二进制、十进制、八进制、十六进制间的相互转换函数1、输入任意一个十进制的整数,将其分别转换为二进制、八进制、十六进制。2、程序代码如下:#include<iostream>usingna...
- 二进制、八进制、十进制和十六进制等常用数制及其相互转换
-
从大学开始系统的接触计算机专业,到现在已经过去十几年了,今天整理一下基础的进制转换,希望给还在上高中的表妹一个入门的引导,早日熟悉这个行业。一、二进制、八进制、十进制和十六进制是如何定义的?二进制是B...
- 二进制如何转换成十进制?_二进制如何转换成十进制例子图解
-
随着社会的发展,电器维修由继电器时代逐渐被PLC,变频器,触摸屏等工控时代所替代,特别是plc编程,其数据逻辑往往涉及到数制二进制,那么二进制到底是什么呢?它和十进制又有什么区别和联系呢?下面和朋友们...
- 二进制与十进制的相互转换_二进制和十进制之间转换
-
很多同学在刚开始接触计算机语言的时候,都会了解计算机的世界里面大多都是二进制来表达现实世界的任何事物的。当然现实世界的事务有很多很多,就拿最简单的数字,我们经常看到的数字大多都是十进制的形式,例如:我...
- 十进制如何转换为二进制,二进制如何转换为十进制
-
用十进制除以2,除的断的,商用0表示;除不断的,商用1表示余0时结束假如十进制用X表示,用十进制除以2,即x/2除以2后为整数的(除的断的),商用0表示;除以2除不断的,商用1表示除完后的商0或1...
- 十进制数如何转换为二进制数_十进制数如何转换为二进制数举例说明
-
我们经常听到十进制数和二进制数,电脑中也经常使用二进制数来进行计算,但是很多人却不清楚十进制数和二进制数是怎样进行转换的,下面就来看看,十进制数转换为二进制数的方法。正整数转二进制...
- 二进制转化为十进制,你会做吗?一起来试试吧
-
今天孩子问把二进制表示的110101改写成十进制数怎么做呀?,“二进制”简单来说就是“满二进一”,只用0和1共两个数字表示,同理我们平常接触到的“十进制”是“满十进一”,只用0-9共十个数字表示。如果...
- Mac终于能正常打游戏了!苹果正逐渐淘汰Rosetta转译
-
Mac玩家苦转译久矣!WWDC2025苹果正式宣判Rosetta死刑,原生游戏时代终于杀到。Metal4光追和AI插帧技术直接掀桌,连Steam都连夜扛着ARM架构投诚了。看到《赛博朋克2077》...
- 怎么把视频的声音提出来转为音频?音频提取,11款工具实测搞定
-
想把视频里的声音单独保存为音频文件(MP3/AAC/WAV/FLAC)用于配音、播客、听课或二次剪辑?本文挑出10款常用工具,给出实测可复现的操作步骤、优缺点和场景推荐。1)转换猫mp3转换器(操作门...
- 6个mp4格式转换器测评:转换速度与质量并存!
-
MP4视频格式具有兼容性强、视频画质高清、文件体积较小、支持多种编码等特点,适用于网络媒体传播。如果大家想要将非MP4格式的视频转换成MP4的视频格式的话,可以使用MP4格式转换器更换格式。本文分别从...