7

Pythonモジュールのすべてのクラスを名前のないオブジェクトのリストに初期化する方法はありますか?

rulesクラス Rule のすべての子クラスを含む モジュールがあります。そのため、それらはすべてメソッドを実装し、呼び出し中に生成されるrun()属性を持つと確信していますname__init__

これらのクラスから動的に開始されるオブジェクトのリストが必要です。動的に初期化されるということは、明示的に名前を付ける必要がないことを意味します。

質問は次のとおりです。

モジュール内のすべてのクラスを反復処理することは可能ですか?

名前のないオブジェクトを開始できますか?

4

1 に答える 1

8

少なくとも 2 つの方法があります。__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ですから、どうにか対処しなければなりません。

編集: issubclass@Blckknght の提案に従って癖に対処します。

于 2013-08-19T15:07:19.880 に答える