CodeWalk

Python 中的抽象基类注册

作者:专业代码师 · 2026-05-30 12:55

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 大量使用此机制