我需要一种有效的方法来获得所有的类,这些类是从Python的基类继承而来的。
发布于 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
发布于 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
发布于 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)
。
https://stackoverflow.com/questions/3862310
复制相似问题