对于任何类,您都可以通过调用__mro__
来通过属性__subclasses__
和(非虚拟)子类来告诉(非虚拟)超类。
对于任何ABC,您可以通过属性_abc_registry
告诉所有虚拟子类。
有没有办法告诉一个类的所有虚拟超类,即它注册为虚拟子类的所有类?
答案 0 :(得分:1)
对于任何ABC,您可以通过属性' _abc_registry'告诉所有虚拟子类。
不,你不能。您只能通过这种方式找到显式注册的虚拟子类。由__subclasshook__
处理的任何内容都不会显示在您的支票中。
要执行您尝试执行的操作,您必须完成Python会话中定义的每个ABC并调用isinstance
。虽然在CPython中通过使用__subclasses__
方法遍历类型层次结构在技术上是可行的,但这可能是一个坏主意。
答案 1 :(得分:1)
我想你在问是否有办法找到所有被认为是给定ABC的子类的类。除了遍历全局和本地命名空间并对它们进行全部测试之外,答案是否定的,没有办法做到这一点。
就其本质而言,ABCs并不知道"关于他们的子类(任何类都可以是ABC的子类,具体取决于__subclasshook__
方法返回的内容,即子类是否实现了正确的接口)。如果您发现自己想要这样做,我会认为这可能是设计糟糕的症状。可能值得深思的是,为什么它确实是你发现自己想要做到这一点。