Python基础教程(三十一)继承和多态:Python万物皆流:继承与多态的动态哲学

"当鸭子游泳像鸭、叫声像鸭——它就是鸭。" Python用动态类型重构了面向对象核心,让继承链流淌如活水。


继承机制:C3算法的拓扑魔术

class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass  # 钻石继承结构

print(D.mro())  
# 输出:[D, B, C, A, object] - 宽度优先的C3线性化
  • MRO动态生成:基于继承图拓扑排序
  • super()本质super(D, self).method() 等价于 self.__class__.mro()[1].method()
  • 混入类(Mixin):无继承关系的横向功能注入

鸭子类型:无契约的多态革命

class Duck:
    def quack(self): print("嘎嘎")

class Person:
    def quack(self): print("伪鸭叫")

def in_forest(obj):
    obj.quack()  # 不检查类型,只认行为

in_forest(Duck())   # 嘎嘎
in_forest(Person()) # 伪鸭叫
  • 多态不依赖继承关系
  • 协议接口:实现__iter__即为可迭代对象
  • 内置函数如len()依赖对象实现__len__协议

抽象基类:动态语言的静态约束

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self): pass  # 强制接口

class Circle(Shape):
    def area(self):        # 必须实现
        return 3.14 * self.radius**2
  • collections.abc定义容器接口(如Iterable, Sequence)
  • 注册虚拟子类:Sequence.register(tuple)
  • __subclasshook__实现自定义类型检查

实战演绎:标准库中的继承艺术

案例

继承策略

多态体现

Django Model

模型字段层级继承

save()方法的多态调用

异常体系

Exception层级捕获

捕获基类即捕获所有子类异常

io模块

TextIOWrapper多重继承

同时继承BufferedIOBase和TextIOBase

pathlib.Path

纯虚基类PathBase

不同操作系统返回Path子类实例

思考题:当鸭子类型遭遇@overload类型提示,动态多态与静态约束能否共存?Python 3.12的typing.override装饰器正试图给出答案——这是语言的进化还是对哲学初衷的背叛?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值