Given a base class named ParentClass
, how can I find all leaf subclasses of it? For example, if I have:
class ParentClass:
pass
class SubClass1(ParentClass):
pass
class SubClass2(ParentClass):
pass
class SubClass3(ParentClass):
pass
class SubClass4(SubClass2):
pass
class SubClass5(SubClass2):
pass
class SubClass6(SubClass2, SubClass3):
pass
I want a list containing, [SubClass1, SubClass4, SubClass5, SubClass6]
, and not SubClass2
or SubClass3
as they are not leaves in the inheritance hierarchy.
This function starts with the parent class and iterates through its subclasses, appending the unique leaf subclasses to a list.
def leaf_subclasses(parent_class):
leaves = []
subclasses = [parent_class]
while subclasses:
next_subclasses = []
for cls in subclasses:
if cls.__subclasses__():
next_subclasses.extend(cls.__subclasses__())
elif cls not in leaves:
leaves.append(cls)
subclasses = next_subclasses
return leaves
print(leaf_subclasses(ParentClass))