在 Python 中查找一个类的所有子类

在 Python 中查找一个类的所有子类

Find all subclasses of a class in Python

使用该class.__subclasses__()方法查找一个类的所有子类。
__subclasses__属性返回给定类的直接子类列表。

主程序
class Person(): pass class Employee(Person): pass class Developer(Person): pass subclasses = Person.__subclasses__() # 👇️ [<class '__main__.Employee'>, <class '__main__.Developer'>] print(subclasses) # ✅ get immediate subclasses of class names_of_subclasses = [ subclass.__name__ for subclass in Person.__subclasses__()] print(names_of_subclasses) # 👉️ ['Employee', 'Developer']
请注意,该class.__subclasses__()方法仅返回给定类的直接子类。如果您需要获取直接和嵌套的子类,请向下滚动到下一个代码片段。

我们使用该__subclasses__()方法来获取一个类的直接子类的列表。

如果您只需要子类的名称而不需要实际的对象,请使用列表理解来遍历子类列表。

以下函数查找一个类的所有子类,而不仅仅是直接的子类。
主程序
class Person(): pass class Employee(Person): pass # 👇️ subclass of Employee (not Person) class Developer(Employee): pass def get_all_subclasses(cls): subclasses = [] for subclass in cls.__subclasses__(): subclasses.append(subclass) subclasses.extend(get_all_subclasses(subclass)) return subclasses all_subclasses = get_all_subclasses(Person) # 👉️ [<class '__main__.Employee'>, <class '__main__.Developer'>] print(all_subclasses) names_of_subclasses = [subclass.__name__ for subclass in all_subclasses] print(names_of_subclasses) # 👉 ['Employee', 'Developer']

请注意,Developer该类是 的子类Employee,而不是 的子类Person

get_all_subclasses函数接受一个类并递归地使用该
__subclasses__()方法查找其所有子类。

我们首先将子类附加到subclasses列表中,然后get_all_subclasses()用子类调用的结果扩展列表。

然后该函数获取嵌套的子类并将它们附加到列表中。

如果您使用多重继承并且需要避免子类列表中的重复条目,请改用set对象。

主程序
class Person(): pass class Employee(Person): pass class Developer(Employee, Person): pass def get_all_subclasses(cls): subclasses = set() for subclass in cls.__subclasses__(): subclasses.add(subclass) subclasses.update(get_all_subclasses(subclass)) return list(subclasses) all_subclasses = get_all_subclasses(Person) # 👉️ [<class '__main__.Employee'>, <class '__main__.Developer'>] print(all_subclasses)

Set 对象是唯一元素的无序集合,因此可以保证set.

发表评论