python常用设计模式(python 设计原则)
off999 2024-10-27 11:57 26 浏览 0 评论
Python 是一种多范式的编程语言,它支持多种设计模式。设计模式是一种被广泛应用于软件开发中的解决方案,它提供了一套经过验证的设计思想和方法,用于解决常见的设计问题。
下面介绍几种常见的设计模式:
1、单例模式(Singleton Pattern):确保一个类只有一个实例,并提供全局访问点。
class CEO: _instance = None def __init__(self, name): self.name = name @classmethod def get_instance(cls, name): if not cls._instance: cls._instance = CEO(name) return cls._instance# 创建 CEO 实例ceo1 = CEO.get_instance("John")print(ceo1.name) # 输出: John# 尝试创建另一个 CEO 实例ceo2 = CEO.get_instance("Alice")print(ceo2.name) # 输出: John,仍然是之前创建的 CEO 实例# 验证 ceo1 和 ceo2 是否为同一实例print(ceo1 is ceo2) # 输出: True
在上述代码中,我们定义了一个 CEO 类,其中包含一个私有的类变量 _instance 表示 CEO 实例。通过类方法 get_instance 来获取 CEO 实例,如果 _instance 为空,则创建一个新的 CEO 实例并将其赋值给 _instance,否则直接返回 _instance。
通过调用 CEO.get_instance() 方法,我们可以获取 CEO 实例。由于单例模式的特性,无论我们尝试多次创建 CEO 实例,实际上都会得到同一个实例对象。
输出结果将会是:
John
John
True
2、工厂模式(Factory Pattern):通过工厂类创建对象,将对象的创建与使用相分离。
lass Pen: def __init__(self, color): self.color = color def write(self, text): print(f"Write '{text}' with {self.color} pen.")class PenFactory: def createPen(self, color): if color == 'red': return Pen('red') elif color == 'blue': return Pen('blue') elif color == 'green': return Pen('green') else: return None# 使用工厂模式创建彩色钢笔pen_factory = PenFactory() red_pen = pen_factory.createPen('red') red_pen.write("Hello") blue_pen = pen_factory.createPen('blue') blue_pen.write("World")
在上述代码中,我们定义了一个 Pen 类,表示彩色钢笔,并具有颜色属性和写字的方法。然后我们创建了一个 PenFactory 工厂类,其中的 createPen 方法根据传入的颜色参数,返回相应颜色的钢笔实例。
通过调用 PenFactory 的 createPen 方法,我们可以创建不同颜色的钢笔对象,并调用钢笔对象的 write 方法进行写字操作。
输出结果将会是:
Write 'Hello' with red pen.
Write 'World' with blue pen.
3、观察者模式(Observer Pattern):定义对象之间的一对多依赖关系,当一个对象状态改变时,其所有依赖者会收到通知并自动更新。
class Subject: def __init__(self): self.observers = [] def attach(self, observer): self.observers.append(observer) def detach(self, observer): self.observers.remove(observer) def notify(self, message): for observer in self.observers: observer.update(message)class Observer: def update(self, message): pass# 具体的观察者类class User(Observer): def __init__(self, name): self.name = name def update(self, message): print(f"{self.name} 收到一条新消息:{message}")# 创建主题对象subject = Subject()# 创建观察者对象user1 = User("Alice") user2 = User("Bob") user3 = User("Charlie")# 将观察者绑定到主题对象subject.attach(user1) subject.attach(user2) subject.attach(user3)# 发送通知subject.notify("这是一条通知。")# 解除观察者绑定subject.detach(user2)# 再次发送通知subject.notify("这是另一条通知。")
4、装饰器模式(Decorator Pattern):动态地给对象添加新的功能或责任,同时不修改原始对象的结构。
# 原始组件接口
class Component:
def operation(self):
pass
# 具体组件类
class ConcreteComponent(Component):
def operation(self):
print("执行原始操作")
# 装饰器基类
class Decorator(Component):
def __init__(self, component):
self.component = component
def operation(self):
self.component.operation()
# 具体装饰器类
class ConcreteDecorator(Decorator):
def operation(self):
super().operation()
self.additional_operation()
def additional_operation(self):
print("执行额外操作")
# 创建具体组件对象
component = ConcreteComponent()
# 创建具体装饰器对象并将原始组件对象传入
decorator = ConcreteDecorator(component)
# 调用装饰器对象的操作方法
decorator.operation()
在上述代码中,我们首先定义了一个组件接口 Component,其中包含一个名为 operation 的方法。然后创建了一个具体组件类 ConcreteComponent,它实现了 Component 接口的 operation 方法。
接下来,我们定义了装饰器基类 Decorator,它也是一个具有 operation 方法的组件,但它持有一个组件对象,通过调用组件对象的 operation 方法来实现装饰功能。
最后,我们创建了具体装饰器类 ConcreteDecorator,它继承自 Decorator,在 operation 方法中先调用父类的 operation 方法(即原始组件的操作),然后执行自己的额外操作。
通过创建具体组件对象和具体装饰器对象,并将原始组件对象传入装饰器中,我们可以调用装饰器对象的 operation 方法来实现装饰功能。
输出结果将会是:
执行原始操作
执行额外操作
5、适配器模式(Adapter Pattern):将一个类的接口转换成客户端所期望的另一个接口,使得原本不兼容的类可以一起工作。
# 目标接口
class Target:
def request(self):
pass
# 适配者类
class Adaptee:
def specific_request(self):
print("执行适配者操作")
# 适配器类
class Adapter(Target):
def __init__(self, adaptee):
self.adaptee = adaptee
def request(self):
self.adaptee.specific_request()
# 创建适配者对象
adaptee = Adaptee()
# 创建适配器对象并将适配者对象传入
adapter = Adapter(adaptee)
# 调用适配器对象的方法
adapter.request()
在上述代码中,我们首先定义了一个目标接口 Target,其中包含一个名为 request 的方法。
然后创建了一个适配者类 Adaptee,它有一个名为 specific_request 的方法,表示适配者自己的操作。
接下来,我们定义了适配器类 Adapter,它继承自目标接口 Target,并在构造函数中接收一个适配者对象。在适配器的 request 方法中,调用适配者对象的 specific_request 方法来实现对适配者的适配。
通过创建适配者对象和适配器对象,并将适配者对象传入适配器中,我们可以调用适配器对象的 request 方法来进行适配操作。适配器会将请求转发给适配者并执行适配者的操作。
输出结果将会是:
6、执行适配者操作策略模式(Strategy Pattern):定义一系列算法,将每个算法封装起来,并使它们可以互相替换,使得算法可以独立于使用它的客户端而变化。
# 策略接口
class Strategy:
def do_operation(self):
pass
# 具体策略类 A
class ConcreteStrategyA(Strategy):
def do_operation(self):
print("执行策略 A 的操作")
# 具体策略类 B
class ConcreteStrategyB(Strategy):
def do_operation(self):
print("执行策略 B 的操作")
# 上下文类
class Context:
def __init__(self, strategy):
self.strategy = strategy
def set_strategy(self, strategy):
self.strategy = strategy
def execute_strategy(self):
self.strategy.do_operation()
# 创建具体策略对象
strategy_a = ConcreteStrategyA()
strategy_b = ConcreteStrategyB()
# 创建上下文对象并将具体策略对象传入
context = Context(strategy_a)
# 执行当前策略
context.execute_strategy()
# 切换策略为策略 B
context.set_strategy(strategy_b)
# 再次执行策略
context.execute_strategy()
在上述代码中,我们首先定义了一个策略接口 Strategy,其中包含一个名为 do_operation 的方法。
然后创建了两个具体策略类 ConcreteStrategyA 和 ConcreteStrategyB,它们分别实现了 Strategy 接口的 do_operation 方法,表示不同的具体策略。
接下来,我们定义了上下文类 Context,它持有一个策略对象,并提供了设置策略和执行策略的方法。
通过创建具体策略对象和上下文对象,并将具体策略对象传入上下文中,我们可以调用上下文对象的 execute_strategy 方法来执行当前设置的策略。
输出结果将会是:
执行策略 A 的操作
执行策略 B 的操作
相关推荐
- 使用 python-fire 快速构建 CLI_如何搭建python项目架构
-
命令行应用程序是开发人员最好的朋友。想快速完成某事?只需敲击几下键盘,您就已经拥有了想要的东西。Python是许多开发人员在需要快速组合某些东西时选择的第一语言。但是我们拼凑起来的东西在大多数时候并...
- Python 闭包:从底层逻辑到实战避坑,附安全防护指南
-
一、闭包到底是什么?你可以把闭包理解成一个"带记忆的函数"。它诞生时会悄悄记下自己周围的变量,哪怕跑到别的地方执行,这些"记忆"也不会丢失。就像有人出门时总会带上...
- 使用Python实现九九乘法表的打印_用python打印一个九九乘法表
-
任务要求九九乘法表的结构如下:1×1=11×2=22×2=41×3=32×3=63×3=9...1×9=92×9=18...9×9=81使用Python编写程序,按照上述格式打印出完整的九...
- 吊打面试官(四)--Java语法基础运算符一文全掌握
-
简介本文介绍了Java运算符相关知识,包含运算规则,运算符使用经验,特殊运算符注意事项等,全文5400字。熟悉了这些内容,在运算符这块就可以吊打面试官了。Java运算符的规则与特性1.贪心规则(Ma...
- Python三目运算基础与进阶_python三目运算符判断三个变量
-
#头条创作挑战赛#Python中你学会了三步运算,你将会省去很多无用的代码,我接下来由基础到进阶的方式讲解Python三目运算基础在Python中,三目运算符也称为条件表达式。它可以通过一行代码实现条...
- Python 中 必须掌握的 20 个核心函数——set()详解
-
set()是Python中用于创建集合的核心函数,集合是一种无序、不重复元素的容器,非常适合用于成员检测、去重和数学集合运算。一、set()的基本用法1.1创建空集合#创建空集合empty_se...
- 15个让Python编码效率翻倍的实用技巧
-
在软件开发领域,代码质量往往比代码数量更重要。本文整理的15个Python编码技巧,源自开发者在真实项目中验证过的工作方法,能够帮助您用更简洁的代码实现更清晰的逻辑。这些技巧覆盖基础语法优化到高级特性...
- 《Python从小白到入门》自学课程目录汇总(和猫妹学Python)
-
小朋友们好,大朋友们好!不知不觉,这套猫妹自学Python基础课程已经结束了,猫妹体会到了水滴石穿的力量。水一直向下滴,时间长了能把石头滴穿。只要坚持不懈,细微之力也能做出很难办的事。就比如咱们的学习...
- 8÷2(2+2) 等于1还是16?国外网友为这道小学数学题吵疯了……
-
近日,国外网友因为一道小学数学题在推特上争得热火朝天。事情的起因是一个推特网友@pjmdoll发布了一条推文,让他的关注者解答一道数学题:Viralmathequationshavebeen...
- Python学不会来打我(21)python表达式知识点汇总
-
在Python中,表达式是由变量、运算符、函数调用等组合而成的语句,用于产生值或执行特定操作。以下是对Python中常见表达式的详细讲解:1.1算术表达式涉及数学运算的表达式。例如:a=5b...
- Python运算符:数学助手,轻松拿咧
-
Python中的运算符就像是生活中的数学助手,帮助我们快速准确地完成这些计算。比如购物时计算总价、做家务时分配任务等。这篇文章就来详细聊聊Python中的各种运算符,并通过实际代码示例帮助你更好地理解...
- Python学不会来打我(17)逻辑运算符的使用方法与使用场景
-
在Python编程中,逻辑运算符(LogicalOperators)是用于组合多个条件表达式的关键工具。它们可以将多个布尔表达式连接起来,形成更复杂的判断逻辑,并返回一个布尔值(True或Fa...
- Python编程基础:运算符的优先级_python中的运算符优先级问题
-
多个运算符同时出现在一个表达式中时,先执行哪个,后执行哪个,这就涉及运算符的优先级。如数学表达式,有+、-、×、÷、()等,优先级顺序是()、×、÷、+、-,如5+(5-3)×4÷2,先计算(5-3)...
- Python运算符与表达式_python中运算符&的功能
-
一、运算符分类总览1.Python运算符全景图2.运算符优先级表表1.3.1Python运算符优先级(从高到低)优先级运算符描述结合性1**指数右→左2~+-位非/一元加减右→左3*//...
- Python操作Excel:从基础到高级的深度实践
-
Python凭借其丰富的库生态系统,已成为自动化处理Excel数据的强大工具。本文将深入探讨五个关键领域,通过实际代码示例展示如何利用Python进行高效的Excel操作,涵盖数据处理、格式控制、可视...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 使用 python-fire 快速构建 CLI_如何搭建python项目架构
- Python 闭包:从底层逻辑到实战避坑,附安全防护指南
- 使用Python实现九九乘法表的打印_用python打印一个九九乘法表
- 吊打面试官(四)--Java语法基础运算符一文全掌握
- Python三目运算基础与进阶_python三目运算符判断三个变量
- Python 中 必须掌握的 20 个核心函数——set()详解
- 15个让Python编码效率翻倍的实用技巧
- 《Python从小白到入门》自学课程目录汇总(和猫妹学Python)
- 8÷2(2+2) 等于1还是16?国外网友为这道小学数学题吵疯了……
- Python学不会来打我(21)python表达式知识点汇总
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)