Z
ZHANK
面向对象

抽象类与协议

ABC/abstractmethod、Protocol 静态鸭子类型、虚子类

抽象类与协议

ABC(Abstract Base Class)强制子类实现方法。Protocol(PEP 544)实现静态鸭子类型——不继承也能"满足"接口。

学完本章你将: 掌握 ABC/abstractmethod、Protocol、虚子类。


ABC —— 强制接口

python
from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def speak(self) -> str:
        ...

    @abstractmethod
    def move(self) -> str:
        ...

class Dog(Animal):
    def speak(self) -> str:
        return "汪汪!"

    def move(self) -> str:
        return "奔跑"

# Animal()  # ❌ 不能实例化抽象类
# class Cat(Animal): ...  # ❌ 没实现所有抽象方法也报错

Protocol —— 静态鸭子类型(PEP 544)

python
from typing import Protocol

class Flyable(Protocol):
    def fly(self) -> str:
        ...

def make_it_fly(obj: Flyable) -> None:
    print(obj.fly())

class Bird:
    def fly(self) -> str:
        return "鸟儿在飞"

class Airplane:
    def fly(self) -> str:
        return "飞机起飞"

make_it_fly(Bird())      # ✅ 有 fly 方法即可
make_it_fly(Airplane())  # ✅ 不需要继承 Flyable

虚子类 —— 注册而非继承

python
from collections.abc import Sequence

# 让自定义类"变成" Sequence 的子类
@Sequence.register
class MyList:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...

print(issubclass(MyList, Sequence))  # True