- Python 学习路径:从零到精通
- Python 环境搭建
- Python 基础语法
- Python 数据结构
- Python 字符串操作
- Python 文件读写
- Python 函数进阶
- Python 面向对象编程(OOP)
- Python 异常处理
- Python 模块与包
- Python 迭代器与生成器
- Python 装饰器
- Flask 基础与入门
- Django 框架基础
- Python RESTful API 开发
- Python Web 表单与用户认证
- Python 数据的操作
- SQLAlchemy ORM 的使用
- Pandas 数据分析基础
- Numpy 数值计算
- 数据可视化(Matplotlib, Seaborn)
- 数据导入导出(CSV, Excel, JSON)
- 使用 requests 库进行 HTTP 请求
- 使用 BeautifulSoup 或 Scrapy 进行网页解析
- 线程与进程的概念
- 使用 threading 模块实现多线程
- 使用 multiprocessing 模块实现多进程
- GIL(全局解释器锁)的概念与影响
- Python 自动化脚本
- Python 常用设计模式
- Python 性能分析工具
- Python 内存管理与优化
- 并行与异步编程(asyncio, concurrent.futures)
- 测试驱动开发(TDD)
- WebSocket 实时通信
- Python GraphQL API 开发
- 前后端分离与前端框架(Vue.js, React)的集成
- 使用 Docker 容器化部署 Python 应用
- CI/CD 流程的自动化(GitHub Actions, Jenkins)
- Scikit-learn, TensorFlow 或 PyTorch 的基础知识
- 数据预处理与特征工程
- 构建与训练模型
- 模型评估与调优
- Hadoop 与 Spark 基础
- 使用 PySpark 进行大数据处理
- 分布式计算与数据流处理
- 基本的加密与解密技术
- 简单的网络安全工具(如端口扫描、漏洞检测)
- Web 安全与常见攻击防御(如 SQL 注入、XSS)
- 项目的协作流程
- 撰写高质量的代码与文档
Python 常用设计模式
class 设计模式设计模式是一种软件设计中常用的解决方案,能够帮助开发者写出更高效、可维护的代码。以下是 Python 中常用的几种设计模式:单例模式、工厂模式、观察者模式等的详细介绍与示例讲解。
1. 单例模式 (Singleton Pattern)
概念: 单例模式保证一个类只有一个实例,并提供一个访问它的全局访问点。这在需要共享资源、控制实例数或提供全局配置时非常有用。
实现方式:
- 懒汉式: 只有在需要实例时才创建。
- 饿汉式: 程序一启动就创建实例。
示例:
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
# 使用单例类
s1 = Singleton()
s2 = Singleton()
print(s1 is s2) # 输出: True,说明s1和s2是同一个实例
2. 工厂模式 (Factory Pattern)
概念: 工厂模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法使得类的实例化推迟到子类。
类型:
- 简单工厂模式: 由一个工厂类根据传入的参数来决定创建哪种具体产品类的实例。
- 工厂方法模式: 通过继承,将对象的创建交给子类实现。
- 抽象工厂模式: 提供创建一系列相关或依赖对象的接口,而无需指定它们的具体类。
示例(简单工厂模式):
class Shape:
def draw(self):
raise NotImplementedError("This method should be overridden.")
class Circle(Shape):
def draw(self):
return "Drawing a Circle"
class Square(Shape):
def draw(self):
return "Drawing a Square"
class ShapeFactory:
@staticmethod
def create_shape(shape_type):
if shape_type == "circle":
return Circle()
elif shape_type == "square":
return Square()
else:
return None
# 使用工厂模式创建对象
factory = ShapeFactory()
shape1 = factory.create_shape("circle")
shape2 = factory.create_shape("square")
print(shape1.draw()) # 输出: Drawing a Circle
print(shape2.draw()) # 输出: Drawing a Square
3. 观察者模式 (Observer Pattern)
概念: 观察者模式定义了对象之间的一对多依赖关系,使得当一个对象状态发生改变时,其依赖者(观察者)能够得到通知并自动更新。这通常用于事件驱动系统或模型-视图-控制器 (MVC) 中。
示例:
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):
for observer in self._observers:
observer.update()
class Observer:
def update(self):
raise NotImplementedError("This method should be overridden.")
class ConcreteObserver(Observer):
def __init__(self, name):
self.name = name
def update(self):
print(f"{self.name} received an update!")
# 使用观察者模式
subject = Subject()
observer1 = ConcreteObserver("Observer 1")
observer2 = ConcreteObserver("Observer 2")
subject.attach(observer1)
subject.attach(observer2)
subject.notify()
输出:
Observer 1 received an update!
Observer 2 received an update!
4. 策略模式 (Strategy Pattern)
概念: 策略模式定义了算法族,分别封装起来,使它们可以互相替换。策略模式使得算法的变化独立于使用算法的客户。
示例:
class Strategy:
def execute(self, data):
raise NotImplementedError("This method should be overridden.")
class ConcreteStrategyA(Strategy):
def execute(self, data):
return f"Strategy A processing {data}"
class ConcreteStrategyB(Strategy):
def execute(self, data):
return f"Strategy B processing {data}"
class Context:
def __init__(self, strategy: Strategy):
self._strategy = strategy
def set_strategy(self, strategy: Strategy):
self._strategy = strategy
def execute_strategy(self, data):
return self._strategy.execute(data)
# 使用策略模式
context = Context(ConcreteStrategyA())
print(context.execute_strategy("data")) # 输出: Strategy A processing data
context.set_strategy(ConcreteStrategyB())
print(context.execute_strategy("data")) # 输出: Strategy B processing data
5. 代理模式 (Proxy Pattern)
概念: 代理模式为其他对象提供一种代理以控制对这个对象的访问。通常用于控制访问权限或延迟加载资源。
示例:
class RealSubject:
def request(self):
return "Real Subject Request"
class Proxy:
def __init__(self):
self._real_subject = RealSubject()
def request(self):
print("Proxy handling the request...")
return self._real_subject.request()
# 使用代理模式
proxy = Proxy()
print(proxy.request()) # 输出: Proxy handling the request... Real Subject Request
6. 装饰器模式 (Decorator Pattern)
概念: 装饰器模式允许向现有对象添加新的功能,而不改变其结构。它是一种用于对象行为的动态扩展。
示例:
class Component:
def operation(self):
raise NotImplementedError("This method should be overridden.")
class ConcreteComponent(Component):
def operation(self):
return "Concrete Component"
class Decorator(Component):
def __init__(self, component: Component):
self._component = component
def operation(self):
return self._component.operation()
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"Decorator A({self._component.operation()})"
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"Decorator B({self._component.operation()})"
# 使用装饰器模式
component = ConcreteComponent()
decorator_a = ConcreteDecoratorA(component)
decorator_b = ConcreteDecoratorB(decorator_a)
print(decorator_b.operation()) # 输出: Decorator B(Decorator A(Concrete Component))
7. 适配器模式 (Adapter Pattern)
概念: 适配器模式将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
示例:
class Target:
def request(self):
return "Target's behavior"
class Adaptee:
def specific_request(self):
return "Adaptee's behavior"
class Adapter(Target):
def __init__(self, adaptee: Adaptee):
self._adaptee = adaptee
def request(self):
return f"Adapter({self._adaptee.specific_request()})"
# 使用适配器模式
adaptee = Adaptee()
adapter = Adapter(adaptee)
print(adapter.request()) # 输出: Adapter(Adaptee's behavior)
8. 外观模式 (Facade Pattern)
概念: 外观模式为子系统中的一组接口提供了一个统一的接口。外观定义了一个高层接口,使得子系统更容易使用。
示例:
class SubsystemA:
def operation_a(self):
return "Subsystem A operation"
class SubsystemB:
def operation_b(self):
return "Subsystem B operation"
class Facade:
def __init__(self):
self._subsystem_a = SubsystemA()
self._subsystem_b = SubsystemB()
def operation(self):
result = []
result.append(self._subsystem_a.operation_a())
result.append(self._subsystem_b.operation_b())
return "\n".join(result)
# 使用外观模式
facade = Facade()
print(facade.operation())
输出:
Subsystem A operation
Subsystem B operation
9. 模板方法模式 (Template Method Pattern)
概念: 模板方法模式定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构即可重定义该算法的某些步骤。
示例:
class AbstractClass:
def template_method(self):
self.base_operation()
self.required_operations1()
self.required_operations2()
def base_operation(self):
print("Base operation")
def required_operations1(self):
raise NotImplementedError("This method should be overridden.")
def required_operations2(self):
raise NotImplementedError("This method should be overridden.")
class ConcreteClassA(AbstractClass):
def required_operations1(self):
print("ConcreteClassA operation1")
def required_operations2(self):
print("ConcreteClassA operation2")
# 使用模板方法模式
concrete_class = ConcreteClassA()
concrete_class.template_method()
输出:
Base operation
ConcreteClassA operation1
ConcreteClassA operation2
10. 享元模式 (Flyweight Pattern)
概念: 享元模式通过共享技术来支持大量细粒度对象的高效共享。它减少了内存的使用,并提高了性能。
示例:
class Flyweight:
def __init__(self, intrinsic_state):
self.intrinsic_state = intrinsic_state
def operation(self, extrinsic_state):
return f"Intrinsic: {self.intrinsic_state}, Extrinsic: {extrinsic_state}"
class FlyweightFactory:
_flyweights = {}
@classmethod
def get_flyweight(cls, intrinsic_state):
if intrinsic_state not in cls._flyweights:
cls._flyweights[intrinsic_state] = Flyweight(intrinsic_state)
return cls._flyweights[intrinsic_state]
# 使用享元模式
factory = FlyweightFactory()
flyweight1 = factory.get_flyweight("State1")
flyweight2 = factory.get_flyweight("State2")
flyweight3 = factory.get_flyweight("State1") # 复用之前创建的对象
print(flyweight1.operation("Extrinsic1"))
print(flyweight2.operation("Extrinsic2"))
print(flyweight3.operation("Extrinsic3"))
输出:
Intrinsic: State1, Extrinsic: Extrinsic1
Intrinsic: State2, Extrinsic: Extrinsic2
Intrinsic: State1, Extrinsic: Extrinsic3
以上是 Python 中常用的几种设计模式的介绍与示例。设计模式有助于解决软件开发中的常见问题,使代码更加模块化、可复用和易于维护。在实际项目中,根据需求选择合适的设计模式,可以显著提高代码质量。