有没有办法将python模块中的所有类初始化为无名对象列表?
示例
我有一个模块rules
,它包含类Rule中的所有子类。因此,我确信他们都会实施一种方法run()
,并且会在name
__init__
我想要从这些类动态启动的对象列表。通过动态初始化,我的意思是它们不必明确命名。
问题是:
是否可以遍历模块中的所有类?
可以启动无名对象吗?
答案 0 :(得分:8)
您可以采取至少两种方法。您可以通过调用类的__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
会抛出TypeError
。所以你必须以某种方式处理它。
编辑:按照@ {Blckknght的建议处理issubclass
怪癖。