将模块中的所有类初始化为列表中的无名对象

2024-01-19

有没有办法将 python 模块中的所有类初始化为无名对象列表?

Example我有一个模块rules其中包含类 Rule 中的所有子类。正因为如此,我确信他们都会实现一个方法run()并且会有一个属性name这将在调用期间生成__init__

我想要一个从这些类动态启动的对象列表。通过动态初始化,我的意思是它们不必显式命名。

问题是:

是否可以迭代模块中的所有类?

可以启动无名对象吗?


您至少可以采取两种方法。您可以通过调用类的方法来获取类的所有子类__subclasses__()方法。所以如果你的父类被调用Rule,你可以调用:

rule_list = [cls() for cls in Rule.__subclasses__()]

这将为您提供以下所有子类Rule,并且不会将它们限制为在特定模块中找到的那些。

如果您有模块的句柄,则可以迭代其内容。就像这样:

import rule
rule_list = []
for name in dir(rule):
    value = getattr(rule, name)
    if isinstance(value, type) and issubclass(value, Rule):
        rule_list.append(value())

很遗憾,issubclass throws TypeError如果你给它一个不是类的对象作为它的第一个参数。所以你必须以某种方式处理这个问题。

编辑:处理issubclass根据@Blckknght 的建议有点奇怪。

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

将模块中的所有类初始化为列表中的无名对象 的相关文章

随机推荐