如何根据给定名称查找一个类的所有子类?

2024-04-16

我需要一种获取从 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__如上。

如何从名称找到类取决于您期望在哪里找到它。如果您希望在与尝试查找该类的代码相同的模块中找到它,那么

cls = globals()[name]

会完成这项工作,或者在不太可能的情况下,你希望在当地人中找到它,

cls = locals()[name]

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

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

不管你发现什么班级,cls.__subclasses__()然后将返回其子类的列表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据给定名称查找一个类的所有子类? 的相关文章

随机推荐

  • Perl 调用带括号和不带括号的方法

    一些 Perl 书籍建议在调用类方法时使用括号 称这有助于使解析器不必猜测代码的意图 然而 我见过的几乎所有 Perl 代码 包括 cpan 上的模块 在调用不带参数的方法时很少使用括号 省略这些括号是正常的还是我应该总是输入它们 我编写了
  • Keras:使用 flow_from _directory() 函数为两个输入模型创建自定义生成器

    我试图用以下方法训练我的暹罗网络fit generator 我从这个答案中了解到 Keras 如何将 fit generator 与多个输入一起使用 https stackoverflow com questions 49404993 ke
  • 通过实施 Web 服务向 Alexa 托管自定义技能

    我正在开发一个网络服务 用于处理 Alexa 发送的请求并在 net 框架中以特定响应进行响应 Alexa 以 JSON 格式发送到您的服务的请求正文 如下所示 version string session new true session
  • 使用AppService的连接持续时间有限制吗?

    我有一个 UWP 应用程序托管应用服务 https learn microsoft com en us windows uwp launch resume how to create and consume an app service在同
  • Pyspark 错误:Java 网关进程在发送其端口号之前退出

    我正在使用 Pyspark 在 Jupyter Notebook 中运行一些命令 但它抛出错误 我尝试了此链接中提供的解决方案 Pyspark 异常 Java 网关进程在向驱动程序发送其端口号之前退出 https stackoverflow
  • /usr/bin/ld: 找不到 -llibeststring.a

    我在我的程序中使用 Festival TTS C API 我已经从以下位置下载了所有文件http www cstr ed ac uk downloads festival 2 0 95 http www cstr ed ac uk down
  • Python urllib2.urlopen() 很慢,需要更好的方法来读取多个 url

    正如标题所示 我正在开发一个用 python 编写的网站 它多次调用 urllib2 模块来读取网站 然后我用 BeautifulSoup 解析它们 由于我必须阅读 5 10 个网站 因此页面需要一段时间才能加载 我只是想知道是否有办法一次
  • 在 iOS 5 中播放视频

    我正在尝试遵循本教程link http www techotopia com index php Video Playback from within an iOS 5 iPhone Application 但我有问题 有人可以看一下并让我
  • oracle pl/sql中的XML解析

    我正在尝试在 PL SQL 中解析此 XML
  • 在 WHERE 中使用 ROW_NUMBER() 别名[重复]

    这个问题在这里已经有答案了 在 Postgresql 9 1 中 我尝试使用 ROW NUMBER 别名字段过滤 WHERE 子句中的结果集 这个查询工作正常 SELECT inv client pk inv invoice pk inv
  • 监听来自UIWebView的所有请求

    我可以使用以下方法拦截来自 UIWebView 的初始加载请求 BOOL webView UIWebView webView shouldStartLoadWithRequest NSURLRequest request navigatio
  • 在 Javascript 中声明函数最有效的方法是什么?

    我一直了解到 要在 javascript 中声明函数 您应该执行以下操作 function myfunction fruit alert I like fruit 或类似的东西 var myfunction function fruit a
  • 如何获取子 ng-repeat 内父作用域数组/ng-repeat 的索引

    我正在建一张桌子 我有两张桌子ng repeat为了我的桌子 我的问题是 这是否有可能是ng repeat可以得到父级ng repeat的索引 例如 tbody tr td company the company index and pro
  • 为什么 Google 的 OpenID 实现的 ID 会发生变化?

    我正在尝试为 Web 应用程序实现 OpenId 登录 每当新用户通过 OpenId 登录时 我都会在系统上创建一个新用户 并在数据中存储他们的 openid URL 以便下次他们使用该用户登录时 我正在使用 Gmail OpenID 对此
  • 如何为armv6、armv7和i386编译静态库(fat)

    我知道这个问题已经被提出过好几次了 但我的目标与我在网上搜索到的内容略有不同 具体来说 我已经能够为 iPhone 构建静态库 但我能够构建的最终 fat 文件仅包含arm和i386架构 并且我不确定arm指的是 v6还是v7 我无法专门针
  • C++ 中谓词是什么? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 您能举一些例子或主题链接吗 谓词是一
  • Jquery中的onclick函数不起作用

    在product showcase js 文件的帮助下 我将内容加载到 HTML 中 然后使用以下类单击产品链接即内在我正在尝试组织一个单击事件如product description js所示 数据是从 json 文件中获取的 我能够将数
  • 将照片上传到 MVC 4 应用程序

    我正在尝试创建一个控制器来在我的 MVC4 应用程序中上传照片 但我不断收到此错误 输入不是有效的 Base 64 字符串 因为它包含非 Base 64 字符 两个以上的填充字符或填充字符中包含非空白字符 照片控制器 cs public c
  • 使用 php 客户端库 v3 将视频上传到 youtube

    我正在尝试使用客户端库 v3 将视频上传到 youtube v3 库是实验性的 没有太多文档 提供的示例不包括 youtube 我已经使用 oauth 2 0 正确验证了用户身份 当我拥有访问令牌时 我正在尝试使用此代码 if client
  • 如何根据给定名称查找一个类的所有子类?

    我需要一种获取从 Python 基类继承的所有类的工作方法 新式类 即从object 这是 Python 3 中的默认设置 subclasses 返回子类的方法 class Foo object pass class Bar Foo pas