首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何找到给定名称的类的所有子类?

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

Stack Overflow用户
提问于 2010-10-05 17:17:35
回答 6查看 131K关注 0票数 272

我需要一种有效的方法来获得所有的类,这些类是从Python的基类继承而来的。

EN

回答 6

Stack Overflow用户

发布于 2013-06-22 10:22:15

如果你只想要直接的子类,那么.__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
票数 71
EN

Stack Overflow用户

发布于 2015-11-09 18:28:00

最简单的一般形式的解决方案:

def get_subclasses(cls):
    for subclass in cls.__subclasses__():
        yield from get_subclasses(subclass)
        yield subclass

如果你有一个继承自的类,还有一个类方法:

@classmethod
def get_subclasses(cls):
    for subclass in cls.__subclasses__():
        yield from subclass.get_subclasses()
        yield subclass
票数 45
EN

Stack Overflow用户

发布于 2020-09-12 01:24:10

下面是一个简单但高效的代码版本:

def get_all_subclasses(cls):
    subclass_list = []

    def recurse(klass):
        for subclass in klass.__subclasses__():
            subclass_list.append(subclass)
            recurse(subclass)

    recurse(cls)

    return set(subclass_list)

它的时间复杂度是O(n),其中n是所有子类的数量,如果没有多重继承的话。它比递归创建列表或生成带有生成器的类的函数更有效,后者的复杂性可能是(1)当类层次结构是平衡树时是O(nlogn),或者(2)当类层次结构是有偏树时是O(n^2)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3862310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档