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

时间:2016-06-06 19:22:14

标签: python

对于任何类,您都可以通过调用__mro__来通过属性__subclasses__和(非虚拟)子类来告诉(非虚拟)超类。

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

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

2 个答案:

答案 0 :(得分:1)

  

对于任何ABC,您可以通过属性' _abc_registry'告诉所有虚拟子类。

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

要执行您尝试执行的操作,您必须完成Python会话中定义的每个ABC并调用isinstance。虽然在CPython中通过使用__subclasses__方法遍历类型层次结构在技术上是可行的,但这可能是一个坏主意。

答案 1 :(得分:1)

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

就其本质而言,ABCs并不知道"关于他们的子类(任何类都可以是ABC的子类,具体取决于__subclasshook__方法返回的内容,即子类是否实现了正确的接口)。如果您发现自己想要这样做,我会认为这可能是设计糟糕的症状。可能值得深思的是,为什么它确实是你发现自己想要做到这一点。