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

Python混入类高级设计

"""Python混入类高级设计——Mixin、ABC 与协作式 super()
------------------------------------------------------------------------------
Mixin 通过多重继承组合可复用行为。结合 ABC 抽象约束和 cooperative super()
调用,可实现灵活优雅的类层次。关键是 Mixin 间用 **kwargs 协作不阻塞链。
"""

from abc import ABC, abstractmethod
from typing import Any, Dict


# ========== 1. 基础 Mixin:注入能力 ==========

class LogMixin:
"""混入日志记录能力"""
def log(self, msg: str, level: str = "INFO") -> None:
print(f"[{level}] {self.__class__.__name__}: {msg}")

class UserService(LogMixin):
def create(self, name: str) -> None:
self.log(f"创建用户:{name}")


# ========== 2. Mixin + ABC 抽象约束 ==========

class SerializableMixin(ABC):
"""抽象 mixin 强制实现者提供 to_dict / from_dict"""
@abstractmethod
def to_dict(self) -> Dict[str, Any]: ...
@classmethod
@abstractmethod
def from_dict(cls, data: Dict[str, Any]) -> "SerializableMixin": ...
def to_json(self) -> str:
import json; return json.dumps(self.to_dict(), ensure_ascii=False)
@classmethod
def from_json(cls, raw: str) -> "SerializableMixin":
return cls.from_dict(json.loads(raw))

class Product(SerializableMixin):
def __init__(self, pid: int, name: str, price: float) -> None:
self.pid, self.name, self.price = pid, name, price
def to_dict(self) -> Dict[str, Any]:
return {"id": self.pid, "name": self.name, "price": self.price}
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> "Product":
return cls(data["id"], data["name"], data["price"])


# ========== 3. **kwargs 协作式 super() 模式 ==========

class BaseMixin:
"""所有 Mixin 的基类,**kwargs 实现协作链"""
def __init__(self, **kwargs: Any) -> None:
super().__init__(**kwargs)

class TimestampMixin(BaseMixin):
def __init__(self, **kwargs: Any) -> None:
self.created = kwargs.pop("created", None)
self.updated = kwargs.pop("updated", None)
super().__init__(**kwargs)

class VersionMixin(BaseMixin):
def __init__(self, **kwargs: Any) -> None:
self.version = kwargs.pop("version", 1)
super().__init__(**kwargs)

class ValidateMixin(BaseMixin):
def validate(self) -> bool:
return True

class SaveMixin(BaseMixin):
def save(self) -> None:
if hasattr(self, "validate") and not self.validate():
raise ValueError("验证失败")
print(f"保存 {self.__class__.__name__}")


# ========== 4. 多重组合与 MRO ==========

class Doc(TimestampMixin, VersionMixin, ValidateMixin, SaveMixin):
"""组合多个 Mixin,super().__init__ 触发 MRO 链"""
def __init__(self, title: str, **kwargs: Any) -> None:
self.title = title
super().__init__(**kwargs)
def validate(self) -> bool:
return bool(self.title)

d = Doc("标题", created="2024-01-01", version=3)
print(Doc.__mro__); d.save()
# 原则:Mixin 命名后缀;**kwargs;统一 BaseMixin;正交避免依赖

http://www.gsyq.cn/news/1429708.html

相关文章:

  • 2026年6月浪琴官方维修服务网点汇总:全国统一售后电话+门店地址一览 - 资讯纵览
  • Play Integrity API Checker:Android设备安全检测的终极免费指南
  • 象棋AI连线工具终极指南:5分钟学会用深度学习帮你下棋
  • [特殊字符]论文写完最怕啥?这个免费查重神器你还不知道?
  • 企业级多租户SaaS平台:RuoYi-Vue-Multi-Tenant如何实现高效数据隔离与统一管理
  • 无人机敏捷门穿越控制:MPC与神经网络的混合框架解析
  • Java学习Six -
  • FPGA仿真环境搭建:除了Vivado/Quartus,如何用Modelsim 10.4搭建独立的第三方仿真平台?
  • Qt跨平台音视频工具:支持RTMP推拉流、软硬解切换、多画面同屏、本地录像与截图
  • 第五节A+B 5
  • 2026年华为OD机试(A卷,100分)- 计算数组中心位置(Java JS Python)带详细答案和源码
  • 用数据说话 降AIGC工具深度测评与推荐 - 降AI小能手
  • 2026年4月市场头部石墨坩埚生产厂家推荐,等静压石墨坩埚/石墨粘土坩埚/氧化锌专用坩埚,石墨坩埚生产厂家怎么选择 - 品牌推荐师
  • 暗黑破坏神2终极优化指南:D2DX让经典游戏在现代PC上完美运行
  • 2026年科瑞昌省电空调:工业降温三大核心趋势 - 资讯纵览
  • 终极Maya动画师效率革命:Studio Library姿势管理完全指南 [特殊字符]
  • 从零打造仿生机械手:Arduino、Python与伺服电机的工程实践
  • 2026年10款降AIGC工具对比:最高AI率100%直降至0.12%
  • 保姆级教程:在CentOS 7上用源码编译安装Netdata 1.0.0,并配置开机自启
  • RNN案例_seq2seq 英译法案例
  • 从数据孤岛到智能闭环,AI与CRM深度整合的4层架构设计全解析,含可复用API对接清单
  • 从下载镜像到进入桌面:一份给纯小白的 VirtualBox 装 Ubuntu 22.04 LTS 保姆级避坑记录
  • 实用高效:chfsgui文件共享工具5分钟快速配置完整指南
  • 北京中央电化教育馆家庭教育指导师报名入口:中山优才教育 - 当下教育培训干货
  • Win10硬盘‘失联’全记录:从拍打到换盘,我的No Bootable Device修复踩坑指南
  • HFSS 2023 R2 新界面速览:从菜单栏到状态栏,高效建模你必须知道的几个冷门技巧
  • 开源:黄大年茶思屋榜文135期 第3题:基于全双工语音交互大模型,解决全双工误停顿、误响应、误打断、响应慢等难点问题
  • 从Linux内核视角看PCIe PRS:IOMMU/SMMU如何与页请求服务协同工作?
  • 2026年苏州口碑较好的防水补漏服务商市场分析与不同场景适配选型指南 专业防水公司排名推荐(2026年5月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 基于Slayer Exciter的迷你固态特斯拉线圈:从电路原理到调谐实战