如何找到给定名称的类的所有子类?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (41)

我需要一种工作方法来获取所有继承自Python基类的类。

提问于
用户回答回答于

新样式类(即从object,这是Python 3中的默认设置。__subclasses__方法,该方法返回以下子类:

class Foo(object): pass
class Bar(Foo): pass
class Baz(Foo): pass
class Bing(Bar): pass

以下是子类的名称:

print([cls.__name__ for cls in vars()['Foo'].__subclasses__()])
# ['Bar', 'Baz']

下面是子类本身:

print(vars()['Foo'].__subclasses__())
# [<class '__main__.Bar'>, <class '__main__.Baz'>]

确认子类确实列出Foo作为他们的基础:

for cls in vars()['Foo'].__subclasses__():
    print(cls.__base__)
# <class '__main__.Foo'>
# <class '__main__.Foo'>

注意,如果您想要子类,您必须递归:

def all_subclasses(cls):
    return cls.__subclasses__() + [g for s in cls.__subclasses__()
                                   for g in all_subclasses(s)]

print(all_subclasses(vars()['Foo']))
# [<class '__main__.Bar'>, <class '__main__.Baz'>, <class '__main__.Bing'>]
用户回答回答于

如果你只是想要直接的子类,那么.__subclasses__()工作正常。如果你想要所有的子类,子类的子类等等,你需要一个函数来为你做。

这里是一个简单的,可读的函数,递归地找到给定类的所有子类:

def get_all_subclasses(cls):
    all_subclasses = []

    for subclass in cls.__subclasses__():
        all_subclasses.append(subclass)
        all_subclasses.extend(get_all_subclasses(subclass))

    return all_subclasses

扫码关注云+社区