Python:如何枚举类的虚拟超类?

2024-05-23 18:46:27 发布

您现在位置:Python中文网/ 问答频道 /正文

对于任何类,您都可以通过属性__mro__告诉(非虚)超类,并通过调用__subclasses__告诉(非虚)子类。你知道吗

对于任何ABC,您都可以通过属性_abc_registry告诉所有虚拟子类。你知道吗

有没有办法告诉一个类的所有虚拟超类,即它注册为虚拟子类的所有类?你知道吗


Tags: 属性子类registryabc办法mrosubclasses
2条回答

For any ABC you can tell all virtual subclasses via the attribute '_abc_registry'.

不,你不能。你只能通过这种方式找到显式注册的虚拟子类。由__subclasshook__处理的任何内容都不会显示在您的支票中。你知道吗

要做您想做的事情,您必须遍历Python会话中定义的每个ABC并调用isinstance。虽然在CPython中,用__subclasses__方法遍历类型层次结构在技术上是可行的,但这可能是个坏主意。你知道吗

我想你是在问是否有办法找到所有被认为是给定ABC的子类的类。除了遍历全局和本地名称空间并测试它们之外,答案是否定的,没有办法做到这一点。你知道吗

就其本质而言,ABC并不“知道”它们的子类(任何类都可以是ABC的子类,这取决于^{}方法返回的内容,即子类是否实现了正确的接口)。如果你发现自己想这样做,我会认为这可能是一个坏的设计症状。也许值得深思的是,为什么你会发现自己想要这么做。你知道吗

相关问题 更多 >