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

The*_*eer 7 python oop

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

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

我想有一个从这些类动态启动的对象列表.通过动态初始化,我的意思是它们不必明确命名.

问题是:

是否可以遍历模块中的所有类?

可以启动无名对象吗?

Mat*_*son 8

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

rule_list = [cls() for cls in Rule.__subclasses__()]
Run Code Online (Sandbox Code Playgroud)

这将为您提供所有子类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())
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果你给它一个不是类的对象作为它的第一个参数,则issubclass抛出TypeError.所以你必须以某种方式处理它.

编辑:issubclass按照@ Blckknght的建议处理怪癖.