Python 中的常用设计模式工具与库

在前面的几篇中,我们已经从理论上理解了设计模式、分类和重构思想。本篇将视角拉回到 Python 本身,看看在实际编写设计模式时,哪些内置工具和标准库最常被用到

掌握这些工具,能让你用更少的代码实现更清晰的设计模式。


一、abc:抽象类的基石

abc(Abstract Base Class)是 Python 实现设计模式时最重要的基础工具之一

典型用途

  • 策略模式
  • 工厂模式
  • 模板方法模式

示例:

python 复制代码
from abc import ABC, abstractmethod

class Payment(ABC):
    @abstractmethod
    def pay(self, amount):
        pass

作用:

  • 强制子类实现指定方法
  • 明确"接口契约"
  • 提前暴露设计错误

二、typing:让设计更清晰

typing 并不是设计模式本身,但它极大提升了模式的可读性与可维护性

1. 类型注解

python 复制代码
def process(payment: Payment) -> None:
    payment.pay(100)

阅读代码时,可以快速理解"这里依赖的是抽象,而不是具体实现"。


2. Protocol:轻量级接口

python 复制代码
from typing import Protocol

class Payable(Protocol):
    def pay(self, amount: int) -> None: ...

特点:

  • 不需要继承
  • 只关心"行为是否存在"
  • 非常适合策略模式、适配器模式

三、functools:函数级设计模式利器

1. functools.wraps

实现装饰器模式时必不可少:

python 复制代码
from functools import wraps

def log(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print("before")
        return func(*args, **kwargs)
    return wrapper

保持原函数的名称、文档等元信息。


2. functools.lru_cache

典型的代理 + 缓存模式实现:

python 复制代码
from functools import lru_cache

@lru_cache(maxsize=128)
def get_user(user_id):
    print("query database")
    return {"id": user_id}

无需显式写代理类,也能实现缓存代理。


四、enum:状态与策略的好搭档

Enum 在状态模式、策略选择中非常实用。

python 复制代码
from enum import Enum

class OrderStatus(Enum):
    CREATED = 1
    PAID = 2
    SHIPPED = 3

优势:

  • 状态语义清晰
  • 避免魔法数字
  • 配合状态模式非常自然

五、dataclasses:简化模型对象

在设计模式中,很多类只是数据载体

python 复制代码
from dataclasses import dataclass

@dataclass
class User:
    id: int
    name: str

优势:

  • 自动生成 __init__
  • 减少样板代码
  • 提升模型类可读性

非常适合建造者模式、原型模式中的对象定义。


六、copy:原型模式的基础

python 复制代码
import copy

obj2 = copy.copy(obj1)      # 浅拷贝
obj3 = copy.deepcopy(obj1)  # 深拷贝

在需要通过"复制已有对象"创建新对象时,原型模式会大量依赖它。


七、contextlib:上下文管理器模式

上下文管理器是 Python 中非常典型的模板方法思想体现

python 复制代码
from contextlib import contextmanager

@contextmanager
def resource():
    print("acquire")
    yield
    print("release")

用途:

  • 资源管理
  • 日志、锁、事务
  • 模板方法模式的函数化实现

八、inspect 与反射机制

Python 的反射能力,在以下模式中非常常见:

  • 工厂模式
  • 插件式架构
  • 依赖注入
python 复制代码
import inspect

inspect.isclass(obj)
inspect.getmembers(module)

让程序在运行时决定"用哪个类、怎么用"。


九、什么时候该用库,什么时候该写模式?

一个实用判断标准:

  • 标准库能解决问题 → 优先用库
  • 业务逻辑复杂、变化频繁 → 设计模式
  • 库解决的是机制,模式解决的是结构

例如:

  • 缓存:lru_cache
  • 对象创建规则复杂:工厂模式
  • 算法可替换:策略模式

十、总结

Python 并不排斥设计模式,反而通过强大的标准库:

  • 让模式实现更简洁
  • 减少模板代码
  • 强化设计表达能力

理解这些工具后,你会发现:
很多 Python 风格的设计模式,并不"长得像"传统 UML,但思想完全一致。

相关推荐
JAVA面经实录9174 分钟前
Java多线程并发高频面试100题(完整版·含答案·背诵版)
java·开发语言·面试
无限进步_13 分钟前
C++异常机制:抛出、捕获与栈展开
开发语言·c++·安全
小白学大数据17 分钟前
深度探索:Python 爬虫实现豆瓣音乐全站采集
开发语言·爬虫·python·数据分析
用户67570498850218 分钟前
Celery 太重了?这可能是你一直在找的 asyncio 任务队列
后端·python·消息队列
Cloud_Shy61819 分钟前
Python 数据分析基础入门:《Excel Python:飞速搞定数据分析与处理》学习笔记系列(第十一章 Python 包跟踪器 下篇)
前端·后端·python·数据分析·excel
Xin_ye1008620 分钟前
C# 零基础到精通教程 - 第八章:面向对象编程(进阶)——继承与多态
开发语言·c#
程序员榴莲20 分钟前
网络编程入门 Python Socket 实现一个简单的用户认证系统
服务器·网络·python
m0_7488394925 分钟前
R包grafify:简单操作实现高效统计绘图
开发语言·r语言
知识分享小能手29 分钟前
Flask入门学习教程,从入门到精通, 认识Flask路由 — 知识点详解 (2)
python·学习·flask
AI棒棒牛29 分钟前
YOLO26改进创新 | 全网首发!VECA弹性核心注意力重塑全局建模,线性复杂度增强检测骨干,嘎嘎创新!
python·yolo·目标检测·yolo26·主干改进