私はパッケージに異なるサブモジュールで定義されたクラスC1, C2, CInvalid3, C4
を含んでいます。いくつかの特定のクラスをPythonモジュールで収集します
my_package/
__init__.py
sub_package1/
__init__.py
sub_module1.py # contains C1, C2
sub_package2/
__init__.py
sub_module2.py # contains CInvalid3, C4
あるクラスの名前を含む文字列を指定すると、対応するクラスを初期化します。例えば、
some_valid_class_name = 'C1'
some_valid_class = all_valid_classes[some_valid_class_name]()
は現在、私は
all_valid_classes = {} # I want the dict contain C1, C2 and C4
def this_is_a_valid_class(cls):
all_valid_classes[cls.__name__] = cls
return cls
を含むモジュールmy_package
下all_classes.py
を作成し、sub_module1.py
とsub_module2.py
に、私は
from my_package.all_classes import this_is_a_valid_class
@this_is_a_valid_class
class C1(object):
pass
を使用して
from .sub_package1 import sub_module1
from .sub_package2 import sub_module2
を追加します
~my_package/__init__.py
。
これを処理する方法はありますか?私はmy_package/__init__.py
にすべてのものをインポートします。新しいsub_package3.sub_module3.C99
を追加するときは、from .sub_package3 import sub_module3
をmy_package/__init__.py
に追加することを覚えておく必要があります。私はこれらが良い考えだとは思わない。あなたは何ができるか、あなたが探しているものを手に入れる
FYI、 '__init __。py'は重要なコードを含むことができます(' import foo'は、インポートディレクトリの最上位に 'foo.py'が含まれているか、' __init __。py'を含む 'foo'という名前のディレクトリです。 'foo.py'と' foo/__ init __。py'の内容が同じ場合、 'import foo'も同じように動作します)。 '__init __。py'も処理したいのですが、スキップしません。 – ShadowRanger
@ShadowRangerディレクトリ内のモジュールをインポートすると '__init __。py'ファイルが自動的にインポートされるため、この場合はスキップしません。 – pacha
あなたはそれらをインポートしていますが、クラスのためにそれらをスキャンしていないので、 '__init __。py'でのみ定義されたクラスは見つかりません。クラス定義を '__init__のみに格納する例については、py'、Pythonの 'collections'モジュールを参照してください。 'collections.abc'にないもののPythonの定義は' collections/__ init __。py'だけで見つけられます。 – ShadowRanger