Python 中的抽象基类注册
Python 抽象基类(ABC)如何注册虚拟子类?register() 和 __subclasshook__ 的作用是什么?
回答
专业代码师
ABC 可以注册虚拟子类——不需要真正继承,但 isinstance() 和 issubclass() 返回 True。
from abc import ABC, abstractmethod
class Sized(ABC):
@abstractmethod
def __len__(self):
pass
# 方法1: register
Sized.register(tuple)
Sized.register(str)
print(isinstance('hello', Sized)) # True
# 方法2: __subclasshook__
class MyABC(ABC):
@classmethod
def __subclasshook__(cls, subclass):
return hasattr(subclass, 'my_method')
class MyClass:
def my_method(self):
pass
print(isinstance(MyClass(), MyABC)) # True
应用场景:
- 让第三方类符合你的接口要求(鸭子类型)
- 不需要修改已有代码
collections.abc大量使用此机制