OOP 深入
inheritance、encapsulation、object-oriented-programming。
35 分钟
面向对象进阶
基础课介绍了 class 与继承;本课覆盖魔术方法、属性描述符、抽象基类与组合优于继承,让你写出可扩展的库级代码。前置:python-fundamentals;Agent 工具封装常用 OOP 模式,见 ai-agents-essentials;路径 /roadmaps/python。
学习目标
- 实现
__repr__、__eq__、__hash__使对象可调试、可比较、可入 set - 使用
@property与@dataclass简化数据类 - 理解 ABC(抽象基类)与 Protocol 风格的鸭子类型
dataclass 与魔术方法
from dataclasses import dataclass, field
from typing import ClassVar
@dataclass(frozen=True, slots=True)
class Lesson:
slug: str
title: str
tags: tuple[str, ...] = field(default_factory=tuple)
version: ClassVar[int] = 1
def __str__(self) -> str:
return f"{self.slug}: {self.title}"
lesson = Lesson("pya-oop", "面向对象进阶", ("oop", "advanced"))
print(lesson) # pya-oop: 面向对象进阶
frozen=True 使实例不可变,可安全作为 dict 键;slots=True(3.10+)减少内存占用。
抽象基类
from abc import ABC, abstractmethod
class Renderer(ABC):
@abstractmethod
def render(self, source: str) -> str:
...
class MarkdownRenderer(Renderer):
def render(self, source: str) -> str:
return source.strip()
def publish(renderer: Renderer, md: str) -> str:
return renderer.render(md)
组合优于继承
class LoggingRenderer:
def __init__(self, inner: Renderer) -> None:
self._inner = inner
def render(self, source: str) -> str:
result = self._inner.render(source)
print(f"rendered {len(result)} chars")
return result
装饰器模式(包装 inner)比多层继承更清晰,FastAPI 中间件同理。
练习
- 为
Lesson实现__eq__仅比较 slug - 写一个
CachedRenderer包装任意 Renderer 并缓存结果 - 对比
@dataclass与手写__init__的代码量
小结
OOP 进阶重在接口清晰与可组合性。 下一课用函数式工具处理数据变换,与 OOP 互补而非对立。