当前位置: 首页 > news >正文

python-patterns:Python 设计模式大全

点关注开车不迷路

python-patterns 是一个开源的 Python 项目,它提供了各种经典的设计模式的 Python 实现。设计模式是一种针对常见软件设计问题的可复用解决方案,通过使用设计模式,开发者可以编写出结构更加合理、易于维护和扩展的代码。

Python 是一门动态语言,很多经典的面向对象设计模式(如工厂模式、单例模式等)都可以通过 Python 的独特特性进行简洁的实现。python-patterns 项目不仅展示了这些设计模式的实现方式,还解释了它们在不同场景中的应用,是学习设计模式和优化代码结构的理想资源。

本文将介绍 python-patterns 项目的主要内容、常见设计模式的 Python 实现,以及如何在实际项目中应用这些模式。

在这里插入图片描述

华丽的分割线

➰缘起

    • 💯 设计模式简介
    • 💯 常见设计模式的 Python 实现
      • 1. 单例模式(Singleton)
      • 2. 工厂模式(Factory Method)
      • 3. 观察者模式(Observer)
      • 4. 装饰器模式(Decorator)
      • 5. 策略模式(Strategy)
    • 💯 在实际项目中的应用
    • 📥 下载地址
    • 💬 结语
    • 📒 参考文献


标题1

💯 设计模式简介

设计模式是一系列经过验证的解决方案,用于解决软件开发过程中遇到的常见问题。这些模式通常分为以下三类:

  1. 创建型模式:主要用于对象的创建,旨在简化对象创建过程并隐藏创建的复杂性。常见的创建型模式包括单例模式、工厂模式、建造者模式等。

  2. 结构型模式:主要用于简化类和对象之间的关系,帮助构建灵活且可扩展的架构。常见的结构型模式有装饰器模式、代理模式、适配器模式等。

  3. 行为型模式:用于管理对象之间的通信,优化对象的行为交互。常见的行为型模式包括观察者模式、策略模式、责任链模式等。


标题2

💯 常见设计模式的 Python 实现

以下是 python-patterns 项目中一些常见设计模式的 Python 实现,展示了如何利用 Python 的特性简洁地实现这些模式。

1. 单例模式(Singleton)

单例模式确保一个类只有一个实例,并提供一个全局访问点。它通常用于需要共享状态或资源的场景,比如日志系统、数据库连接池等。

Python 实现:

class Singleton:_instance = Nonedef __new__(cls):if cls._instance is None:cls._instance = super(Singleton, cls).__new__(cls)return cls._instance# 测试
singleton1 = Singleton()
singleton2 = Singleton()print(singleton1 is singleton2)  # 输出: True

在这个实现中,__new__ 方法确保每次创建新实例时都会返回同一个对象实例。这是一种通过 Python 内置机制实现的简单单例模式。

2. 工厂模式(Factory Method)

工厂模式是一种创建型模式,用于将对象的创建逻辑与使用者解耦。通过工厂方法,用户无需知道具体对象的构造细节,只需要调用工厂函数来获取对象实例。

Python 实现:

class Animal:def speak(self):raise NotImplementedErrorclass Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"class AnimalFactory:@staticmethoddef get_animal(animal_type):if animal_type == "dog":return Dog()elif animal_type == "cat":return Cat()else:raise ValueError("Unknown animal type")# 测试
animal = AnimalFactory.get_animal("dog")
print(animal.speak())  # 输出: Woof!

在这个实现中,AnimalFactory 类通过静态方法 get_animal 创建不同类型的动物实例,而不需要调用者知道具体的类名或创建细节。

3. 观察者模式(Observer)

观察者模式是一种行为型模式,它定义了对象之间的一对多依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。这个模式常用于事件处理系统中,如 GUI 应用中的按钮点击事件等。

Python 实现:

class Subject:def __init__(self):self._observers = []def register(self, observer):self._observers.append(observer)def notify_all(self, *args, **kwargs):for observer in self._observers:observer.update(*args, **kwargs)class Observer:def update(self, *args, **kwargs):pass# 定义具体的观察者
class ConcreteObserver(Observer):def update(self, message):print(f"Received message: {message}")# 测试
subject = Subject()
observer1 = ConcreteObserver()
observer2 = ConcreteObserver()subject.register(observer1)
subject.register(observer2)subject.notify_all("Hello Observers!")  # 输出两次: Received message: Hello Observers!

在这个示例中,Subject 对象维护一个观察者列表,并在其状态发生变化时调用 notify_all 方法通知所有注册的观察者。

4. 装饰器模式(Decorator)

装饰器模式是一种结构型模式,允许在不改变对象自身的情况下动态地为对象添加行为。Python 本身支持装饰器语法,这使得装饰器模式在 Python 中的实现非常方便。

Python 实现:

class Coffee:def cost(self):return 5class MilkDecorator:def __init__(self, coffee):self._coffee = coffeedef cost(self):return self._coffee.cost() + 2class SugarDecorator:def __init__(self, coffee):self._coffee = coffeedef cost(self):return self._coffee.cost() + 1# 测试
coffee = Coffee()
coffee_with_milk = MilkDecorator(coffee)
coffee_with_milk_and_sugar = SugarDecorator(coffee_with_milk)print(coffee_with_milk_and_sugar.cost())  # 输出: 8

在这个例子中,MilkDecoratorSugarDecorator 为原始 Coffee 对象动态地添加了额外的功能(即增加了牛奶和糖的价格)。

5. 策略模式(Strategy)

策略模式是一种行为型模式,它允许在运行时选择不同的算法或策略,而不需要修改使用策略的客户端代码。这种模式经常用于处理可替换的行为逻辑,如支付系统、排序算法等。

Python 实现:

class Strategy:def execute(self, a, b):passclass AddStrategy(Strategy):def execute(self, a, b):return a + bclass SubtractStrategy(Strategy):def execute(self, a, b):return a - bclass Context:def __init__(self, strategy):self._strategy = strategydef set_strategy(self, strategy):self._strategy = strategydef execute_strategy(self, a, b):return self._strategy.execute(a, b)# 测试
context = Context(AddStrategy())
print(context.execute_strategy(5, 3))  # 输出: 8context.set_strategy(SubtractStrategy())
print(context.execute_strategy(5, 3))  # 输出: 2

在这个实现中,Context 类使用不同的策略来执行操作,策略可以在运行时动态替换。


标题3

💯 在实际项目中的应用

设计模式的应用可以使代码更加模块化、易扩展、易维护。在实际项目中,设计模式通常用于以下场景:

  1. 复杂对象的创建:通过工厂模式或建造者模式,简化复杂对象的创建逻辑,避免重复代码。
  2. 动态行为扩展:装饰器模式和策略模式允许在运行时动态修改或替换对象的行为,而无需修改现有代码。
  3. 解耦模块依赖:观察者模式和责任链模式有助于降低模块之间的耦合,使得系统更加灵活。
  4. 事件驱动开发:在基于事件的系统(如 GUI 应用或游戏引擎)中,观察者模式可以用于处理事件传播和响应。

标题4

📥 下载地址


python-patterns 最新版 下载地址


标题5

💬 结语

python-patterns 项目为 Python 开发者提供了丰富的设计模式实现示例,展示了如何通过 Python 的特性简洁高效地实现经典设计模式。通过学习这些模式,开发者可以编写出更加灵活、可扩展的代码架构,提升项目的可维护性。

设计模式在软件开发中的应用非常广泛,无论是大型企业项目,还是个人小型应用,都可以从中受益。如果你正在寻找一种方法来优化你的代码结构,设计模式无疑是一个值得深入学习的领域。


标题8

📒 参考文献

  • python-patterns GitHub仓库

剩蛋快乐


愿者上钩

相关文章:

python-patterns:Python 设计模式大全

python-patterns 是一个开源的 Python 项目,它提供了各种经典的设计模式的 Python 实现。设计模式是一种针对常见软件设计问题的可复用解决方案,通过使用设计模式,开发者可以编写出结构更加合理、易于维护和扩展的代码。 Python 是一门动态语…...

Nginx编译所需基本库pcre、zlib、openssl

一、基本库介绍 pcre:(Perl Compatible Regular Expressions) 是一个用 C 语言编写的正则表达式库,用于进行文本匹配和搜索。它提供了与 Perl 正则表达式兼容的功能,并且广泛用于许多不同的软件项目中,如网…...

C#进阶:探索嵌套类、匿名类及对象初始化器的强大运用

在C#中,嵌套类、匿名类以及对象初始化器是几种强大的特性,它们可以极大地提高代码的可读性和灵活性。下面分别介绍这些特性的运用。 1. 嵌套类 嵌套类是指定义在另一个类内部的类。内部类可以访问其外围类的所有成员(包括私有成员&#xff…...

匈牙利算法模板

P3386 【模板】二分图最大匹配 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路:最模板的一集.还未匹配则匹配&#xff0c;否则之前一个给现在这个让位置. int n,m,e; vector<int> vct[505]; int match[505]; bool vis[505]; bool mark[505][505]; bool dfs(int s)…...

ubuntu 安装harbor

#安装包 wget https://github.com/goharbor/harbor/releases/download/v2.10.3/harbor-offline-installer-v2.10.3.tgz wget https://github.com/goharbor/harbor/releases/download/v2.10.3/harbor-offline-installer-v2.10.3.tgz.asc#导入签名公钥 gpg --keyserver hkps://ke…...

Python/大数据/机器识别毕业设计选题题目推荐

基于Python和Diango在线购物商城系统报告文档指导搭建视频 基于深度学习的人脸识别与管理系统&#xff0c;Python实现 基于Python/机器学习链家网新房数据可视化及预测系统 Python豆瓣电影情感分析推荐系统爬虫可视化&#xff0c;过滤算法 基于python的django框架生鲜商城管…...

基于Python的人工智能应用案例系列(17):LSTM正弦波预测

概述 本案例展示了如何使用LSTM&#xff08;长短期记忆网络&#xff09;来预测正弦波序列的未来值。由于正弦波具有周期性&#xff0c;传统的神经网络难以准确预测其上升或下降趋势&#xff0c;而LSTM则能够通过学习值的模式来进行更精准的预测。本案例将训练LSTM模型并预测正弦…...

Python空间地表联动贝叶斯地震风险计算模型

&#x1f3af;要点 使用贝叶斯推断模型兼顾路径和场地效应&#xff0c;量化传统地理统计曲线拟合技术。使用破裂和场地特征等地质信息以及事件间残差和事件内残差描述数学模型模型使用欧几里得距离度量、角距离度量和土壤差异性度量确定贝叶斯先验分布和后验分布参数&#xff…...

虚幻引擎-设置UI自适应屏幕大小

在游戏中&#xff0c;如果想实现不同分辨率下&#xff0c;都可以支持当前的UI界面布局&#xff0c;都需要用到锚点功能。 ‌虚幻引擎中的UI锚点&#xff08;Anchor&#xff09;是指控件在屏幕或父物体上的固定点&#xff0c;用于确定控件的位置和布局。‌ 锚点的作用是确保UI元…...

C++继承的三种方式[ACCESS]

C继承的定义 两个类的继承关系在派生类中声明&#xff0c;派生类定义使用以下语法&#xff1a; class DerivedClass: [ACCESS] BaseClass{ /…/ }; 冒号&#xff08;:&#xff09;后的[ACCESS]是继承的最高权限级别符&#xff0c;可以是以下三个值&#xff08;存取权限级别&am…...

idea 同一个项目不同模块如何设置不同的jdk版本

在IntelliJ IDEA中&#xff0c;可以为同一个项目中的不同模块设置不同的JDK版本。这样做可以让你在同一个项目中同时使用多个Java版本&#xff0c;这对于需要兼容多个Java版本的开发非常有用。以下是设置步骤&#xff1a; 打开项目设置&#xff1a; 在IDEA中&#xff0c;打开你…...

1-仙灵之谜(区块链游戏详情介绍)

1-仙灵之谜&#xff08;区块链游戏详情介绍&#xff09; 前言&#xff08;该游戏仅供娱乐&#xff09;正文 前言&#xff08;该游戏仅供娱乐&#xff09; 依稀记得本科那会儿参加了一个区块链实验室&#xff0c;那时每周末大家都会爬山或者抽出一下午讨论区块链以及未来&#x…...

基于51单片机的温湿度上下限监测预警proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1hSprWBYhKKx8Txzaj33YPA?pwdjp3d 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMic…...

考核总结.

事件循环 单线程的js在处理异步事件时进行的一种循环过程。 在 JS中任务分为同步与异步任务&#xff0c;其中异步任务又分为两种&#xff1a;宏任务和 微任务。宏任务和微任务的执行顺序&#xff1a;总方针是先同步再异步&#xff0c;异步中先微任务&#xff0c;在宏任务。一次…...

后端学习路线

后端学习路线 一、编程语言 至少需要学习一门编程语言&#xff0c;建议学习JAVA和GO语言。 二、数据库 数据库分为关系型数据库和非关系型数据库&#xff0c;区别在于分关系型数据库常用于大数据&#xff0c;而非关系型数据库一般不在大数据方面使用。 关系型数据库&#x…...

车辆重识别(注意力 U-Net:学习在哪些区域寻找胰腺)论文阅读2024/10/01

什么是注意力机制&#xff1f; 什么是加性注意力&#xff1f; 大致说一下流程&#xff1a; 对于一张特征图来说&#xff0c;对于这张图中的每一个像素向量&#xff08;例如a&#xff09;&#xff0c;计算该向量与所有像素向量的相似度&#xff0c;对这些相似度进行激活函数…...

【区别】git restore --staged <文件> 和 git reset HEAD <文件> 都可以用于取消已暂存的文件

git restore --staged <文件> 和 git reset HEAD <文件> 都可以用于取消已暂存的文件&#xff0c;但它们的工作原理和适用场景有所不同。以下是对这两个命令的详细比较&#xff1a; 1. 命令概述 git restore --staged <文件>&#xff1a; 专门用于将指定文件…...

void类型

编程语言中的void类型是一种特殊的数据类型&#xff0c;它表示不存在任何值。void, 无或者空类型。大部分编程语言支持void, 用做函数无返回值类型。最早ALGOL 68引入void类型。 void的特别使用 经典C缺乏void类型&#xff0c;函数可以不指定返回值&#xff0c;默认是整型int.…...

10/1 力扣 49.字母异位词分组

基本知识&#xff1a; 关于字符串的排序&#xff1a; 1.多个字符串排序 1.1使用python内置的sorted() 使用该函数后原对象并不发生变化 1.2若多个字符串使用列表进行存储&#xff0c;使用列表的sort()方法 使用该函数后原对象原地变化 2.对单个字符串里的字母进行排序 使…...

✨机器学习笔记(六)—— ReLU、多分类问题、Softmax、Adam、反向传播

Course2-Week2: https://github.com/kaieye/2022-Machine-Learning-Specialization/tree/main/Advanced%20Learning%20Algorithms/week2机器学习笔记&#xff08;六&#xff09; 1️⃣ReLU&#xff08;Rectified Linear Unit&#xff09;2️⃣多分类问题3️⃣Softmax4️⃣Adam5…...

Xshell7下载及服务器连接

一、Xshell-7.0.0164p、Xftp 7下载 1.1、文件下载 通过网盘分享的文件&#xff1a;xshell 链接: https://pan.baidu.com/s/1qc0CPv4Hkl19hI9tyvYZkQ 提取码: 5snq –来自百度网盘超级会员v2的分享 1.2、ip连接 下shell和xftp操作一样&#xff1a;找到文件—》新建—》名称随…...

SQL Server—的数据类型

SQL Server—的数据类型 在 SQL Server 数据库中&#xff0c;数据类型是定义数据模型的基础&#xff0c;它们决定了数据在数据库中的存储方式和格式。正确选择数据类型不仅可以优化存储空间&#xff0c;还能提高查询性能和数据完整性。 1文本类型 文本类型&#xff1a;字符数…...

WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!

前言 今天大姚给大家分享一套基于.NET 8.0 LayUI的快速开发框架&#xff0c;项目完全开源、免费&#xff08;MIT License&#xff09;且开箱即用&#xff1a;WaterCloud。 可完全实现二次开发让开发更多关注业务逻辑。既能快速提高开发效率&#xff0c;帮助公司节省人力成本&…...

数据结构-LRU缓存(C语言实现)

遇到困难&#xff0c;不必慌张&#xff0c;正是成长的时候&#xff0c;耐心一点&#xff01; 目录 前言一、题目介绍二、实现过程2.1 实现原理2.2 实现思路2.2.1 双向链表2.2.2 散列表 2.3 代码实现2.3.1 结构定义2.3.2 双向链表操作实现2.3.3 实现散列表的操作2.3.4 内存释放代…...

javacv FFmpegFrameGrabber 阻塞重连解决方法汇总

JavaCV中FrameGrabber类可以连接直播流地址, 进行解码, 获取Frame帧信息, 常用方式如下 FrameGrabber grabber new FrameGrabber("rtsp:/192.168.0.0"); while(true) {Frame frame grabber.grabImage();// ... } 在如上代码中, 若连接地址网络不通, 或者连接超时…...

自然语言处理问答系统技术

自然语言处理问答系统技术 随着人工智能的不断发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术已成为推动智能问答系统发展的核心技术。问答系统是利用NLP来解析用户提出的问题&#xff0c;并从知识库中找到最相关的答案。在许多应用中&#xff0c;如智能客服、…...

交换机和路由器的区别

交换机和路由器的区别主要体现在以下几个方面&#xff1a; 工作层次不同&#xff1a;交换机通常工作在OSI模型的数据链路层&#xff08;第二层&#xff09;&#xff0c;主要根据MAC地址进行数据包转发。而路由器则工作在OSI模型的网络层&#xff08;第三层&#xff09;&#xf…...

JavaScript Array(数组)

JavaScript Array(数组) JavaScript 中的数组是一种特殊的对象,用于存储一系列有序的值。数组是 JavaScript 中非常强大的数据结构,广泛用于各种编程任务。本文将详细介绍 JavaScript 数组的特性、用法和操作方法。 数组的创建 在 JavaScript 中,创建数组有多种方式: …...

示例说明:elasticsearch实战应用

Elasticsearch 是一个基于 Lucene 的分布式搜索和分析引擎&#xff0c;广泛应用于日志分析、全文搜索、数据可视化等领域。以下是 Elasticsearch 实战应用的一些关键点和步骤&#xff1a; 1. 环境搭建 首先&#xff0c;你需要在你的环境中安装和配置 Elasticsearch。 安装 E…...

暴力匹配算法和 KMP 算法的优缺点分别是什么?

暴力匹配算法和 KMP 算法的优缺点分别是什么? 在字符串匹配领域,暴力匹配算法和 KMP(Knuth-Morris-Pratt)算法是两种常见的方法。它们各有特点,适用于不同的场景。让我们深入探讨这两种算法的优缺点。 一、暴力匹配算法 (一)优点 简单易实现:暴力匹配算法的逻辑非常…...

深圳做商城网站建设/公司网站搭建

tar -c 打tar包 -x 解tar包 -g 用gzip来压缩/解压缩文件 -j 使用‘bzip2’程序进行文件的压缩 -v 查看压缩过程 -f 指定文件转载于:https://blog.51cto.com/ceyes/706279...

web模板 免费下载网站/app优化

很多人都知道&#xff0c;前段时间&#xff0c;欧洲一些国家&#xff0c;相继发布了禁售燃油车的时间和计划&#xff0c;全世界似乎都要跨入新能源汽车的时代&#xff0c;发动机是燃油车的心脏&#xff0c;而新能源汽车的心脏&#xff0c;则是动力电池&#xff1b;新能源汽车的…...

香港手表网站大全/长春seo网站管理

1. 給你兩個string if function(s1) function(s2) return trueelse return false. 1point3acres.com/bbsfunction做的事情 遇到b 就刪除前面一個字元 其他就不管 當b太多的時候 return "" for example accc > acccaccb > acabdd > dd. visit 1point3a…...

ecshop 网站标题修改/免费的网站域名查询565wcc

如新语法的字面含义&#xff0c;NOWAIT表示当无法获取到锁时直接返回错误&#xff0c;而不是等待&#xff1b;SKIP LOCKED表示忽略那些已经被其他session占有行锁的记录。下面看测试&#xff1a; 测试 一 session 1 : mysql> select * from t; ---- | a | ---- | 42 | | …...

深圳市住建局和建设局官网/seo排名怎么做

参考链接: class.__mro__ 参考链接: class.mro() 参考链接: class.__subclasses__() 实验代码展示: # class Person(): # class Person(object): # class Person: class Person: # class Person(object): # class Person: # class Person(): 这三种写法都是可以的定义基类Pe…...

律师事务所网站设计/营销型网站建设价格

Python 近两年一直霸占编程语言排行榜 Top3&#xff0c;火热程度有目共睹。这也让刚入行的程序员&#xff0c;甚至 BATJ 的技术大牛&#xff0c;都意识到 Python 对于一个程序员职业发展的重要性&#xff0c;将其作为第一/第二开发语言去学习。虽然 Python 以简单易学著称&…...