使用Python的子类方法查找类的子类
查找给定类的所有子类是常见的Python 需要面向对象编程。 Python 通过 __subclasses__ 方法提供了一个优雅的解决方案。
Python 中的新式类(即从对象类继承的类)有一个 __subclasses__ 方法,该方法返回其子类的列表。考虑以下类层次结构:
class Foo(object): pass class Bar(Foo): pass class Baz(Foo): pass class Bing(Bar): pass
要获取 Foo 的子类,只需调用 Foo.__subclasses__():
print(Foo.__subclasses__()) # Output: [<class '__main__.Bar'>, <class '__main__.Baz'>]
递归子类检索
如果要查找所有子类,包括子子类,递归是必要的:
def all_subclasses(cls): return set(cls.__subclasses__()).union( [s for c in cls.__subclasses__() for s in all_subclasses(c)]) print(all_subclasses(Foo)) # Output: {<class '__main__.Bar'>, <class '__main__.Baz'>, <class '__main__.Bing'>}
处理类名称字符串
您提到查找以字符串形式给出的类名称的子类。由于 Python 类是一等对象,因此建议直接使用类而不是字符串表示形式。但是,如果您确实有类名字符串,则可以使用 globals() 字典检索该类:
name = 'Foo' cls = globals()[name] print(cls.__subclasses__())
对于在不同模块中定义的类,您可以使用 importlib 通过导入其类来检索该类模块并访问相应的属性:
name = 'pkg.module.Foo' import importlib modname, _, clsname = name.rpartition('.') mod = importlib.import_module(modname) cls = getattr(mod, clsname) print(cls.__subclasses__())
以上是如何使用'__subclasses__”查找Python类的子类?的详细内容。更多信息请关注PHP中文网其他相关文章!