抽象类与协议
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