当前位置: 首页 > 面试题库 >

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

葛鸿轩
2023-03-14
问题内容

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


问题答案:

新型类(即objectPython中默认的from的子类)具有一种__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’而不是just ‘Foo’。使用importlib加载类的模块,然后获取相应的属性:

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

但是,找到该类后,cls.__subclasses__()将返回其子类的列表。



 类似资料:
  • 问题内容: 如何去尝试找到Java中给定类的所有子类(或给定接口的所有实现者)?到目前为止,我有一种方法可以执行此操作,但是我发现它效率很低(至少可以这样说)。方法是: 获取类路径上存在的所有类名称的列表 加载每个类并测试以查看它是否是所需类或接口的子类或实现者 在Eclipse中,有一个很好的功能,称为类型层次结构(Type Hierarchy),可以很有效地显示它。如何进行编程? 问题答案:

  • 问题内容: 给定一个类名作为字符串,如何在运行时获取它的包名?我没有带有包名+类名的完全限定名称。仅是类名。 我想在方法中使用包名。 找到第一个匹配的软件包名称(如果多个软件包具有相同的类),就可以了。 有任何想法吗? 更新 我没有要处理的Class实例。我的要求是使用该方法创建一个Class 。但是我只是将类名作为字符串。我需要某种方法来遍历软件包并确定我所拥有的类是否属于该软件包。 异常的堆栈

  • 问题内容: 对于Java开发人员来说,这必须是一个非常基本的问题,但是在给定 类名* 的情况下找到合适的 jar文件 的最佳方法是什么? * 例如,给定“ com.ibm.websphere.security.auth.WSSubject ”,您如何跟踪适当的jar文件?(“ google”不是我要找的答案!) 在Java文档不给jar文件的任何暗示,明显的jar文件的名称本身不提供线索。 在Ja

  • 问题内容: 我想获取给定类的所有子类及其完全限定名称的列表。我想从Eclipse复制它并粘贴到这样的文本文件中: 我试过了: 在做。 但是 出于某些奇怪的原因,这个列表没有列出子类的子类,而只列出了直接子孙。 类的打开视图,该视图在树组件中打印所有子类, 但是 此视图不允许我选择所有行并复制其名称。 还有其他技巧吗?有数百种课程,因此我想避免手动进行。 问题答案: 按照http://internn

  • 问题内容: Python具有和获取字符串中子字符串的索引。 我想知道是否有类似的东西可以返回所有找到的索引(不仅是开头的第一个,还是结尾的第一个)。 例如: 问题答案: 没有简单的内置字符串函数可以满足你的需求,但是你可以使用功能更强大的正则表达式: 如果要查找重叠的匹配项,先行搜索将做到: 如果你想要一个没有重叠的反向查找全部,则可以将正向和负向超前组合成这样的表达式: 返回一个,因此你可以更改

  • 问题内容: 我想杀死所有通过的进程: 怎么做? 这不起作用: 问题答案: 使用,它与命令行的任何部分的模式匹配