gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:21:15 35 4
gpt4 key购买 nike

我需要一种工作方法来获取从 Python 中的基类继承的所有类。

最佳答案

新式类(即从 object 子类化,这是 Python 3 中的默认设置)有一个返回子类的 __subclasses__ 方法:

class Foo(object): pass
class Bar(Foo): pass
class Baz(Foo): pass
class Bing(Bar): pass

以下是子类的名称:

print([cls.__name__ for cls in Foo.__subclasses__()])
# ['Bar', 'Baz']

下面是子类本身:

print(Foo.__subclasses__())
# [<class '__main__.Bar'>, <class '__main__.Baz'>]

确认子类确实将 Foo 列为其基础:

for cls in Foo.__subclasses__():
print(cls.__base__)
# <class '__main__.Foo'>
# <class '__main__.Foo'>

注意如果你想要子类,你必须递归:

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))
# {<class '__main__.Bar'>, <class '__main__.Baz'>, <class '__main__.Bing'>}

请注意,如果一个子类的类定义还没有被执行——例如,如果子类的模块还没有被导入——那么那个子类还不存在,并且__subclasses__ 找不到。


你提到了“给定它的名字”。由于 Python 类是一流的对象,因此您不需要使用带有类名的字符串来代替类或类似的东西。您可以直接使用该类,而且您可能应该这样做。

如果你确实有一个代表类名的字符串,并且你想找到该类的子类,那么有两个步骤:找到给定名称的类,然后用 __subclasses__ 找到子类> 同上。

如何从名称中找到类(class)取决于您希望在哪里找到它。如果您希望在与试图定位该类的代码相同的模块中找到它,那么

cls = globals()[name]

会做这项工作,或者在你期望在本地人找到它的不太可能的情况下,

cls = locals()[name]

如果类可以在任何模块中,那么您的名称字符串应该包含完全限定的名称 - 类似于 'pkg.module.Foo' 而不仅仅是 'Foo'。使用 importlib 加载类的模块,然后检索对应的属性:

import importlib
modname, _, clsname = name.rpartition('.')
mod = importlib.import_module(modname)
cls = getattr(mod, clsname)

无论您如何找到该类,cls.__subclasses__() 都会返回其子类的列表。

关于python - 如何找到给定名称的类的所有子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3862310/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com