栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

新型类(即objectPython中默认的from的子类)具有一种

__subclasses__
返回子类的方法:

class Foo(object): passclass Bar(Foo): passclass Baz(Foo): passclass 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__
上述方法查找子类。

如何从名称中查找类取决于你期望在何处找到它。如果希望与尝试查找该类的代码在同一模块中找到它,则

cls = globals()[name]

可以胜任这项工作,或者在极少数情况下你希望在当地人中找到它,

cls = locals()[name]

如果该类可以位于任何模块中,则你的名称字符串应包含完全限定的名称- ‘pkg.module.Foo’而不是just ‘Foo’。使用importlib加载类的模块,然后获取相应的属性:

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

但是,找到该类后,

cls.__subclasses__()
将返回其子类的列表。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/415873.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号