Python抽象基类(ABC)的使用与原理
请解释Python中抽象基类(ABC)的作用和实现方式。说明abc.ABCMeta元类、@abstractmethod装饰器以及abc.ABC辅助类的用法。如何通过ABCMeta的register()方法实现虚拟子类?
回答
苦行僧
ABC确保子类必须实现特定方法,常用于框架设计。实现方式:
- 继承
abc.ABC(Python 3.4+)或设置元类为abc.ABCMeta - 使用
@abstractmethod装饰抽象方法
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self): pass
class Circle(Shape):
def area(self): return 3.14 * self.r ** 2
实例化未实现抽象方法的子类会抛出TypeError。
虚拟子类:通过ABCMeta.register()将任意类注册为子类,isinstance()返回True但无需继承:
Shape.register(dict)
isinstance({}, Shape) # True
__subclasshook__进一步让isinstance自动识别满足特定协议的类。内置ABC如Iterable、Sized在collections.abc中。