ここにpythonモジュールがあります。foo
ですsys.path
。
foo\
__init__.py
bar\
__init__.py
base.py
class Base(object)
derived.py
import foo.bar.base as base
class Derived(base.Base)
私はまだ空想的なことは何もしていません。モジュールからDerivedクラスをインスタンス化する場合derived
は、簡単に実行できます。
import foo.bar.derived as derived
print(derived.Derived())
ただし、bar
モジュールをインポートして を呼び出すだけにしたいと思いbar.Derived()
ます。これは、さまざまなモジュール内に多数のクラスを配置する予定であり、これらすべての触角的なインポート パスを処理したくないためです。私の理解では、プロジェクトを次のように変更することで、 Derivedをモジュールの名前空間に簡単にインポートできます。bar
foo\
__init__.py
bar\
__init__.py
from foo.bar.derived import Derived
base.py
class Base(object)
derived.py
import foo.bar.base as base
class Derived(base.Base)
これで、次のことができるはずです。
import foo.bar as bar
print(bar.Derived())
foo
しかし、モジュールに と呼ばれるサブモジュールがないことを訴える AttributeError が表示されbar
ます。
test.py (1): import foo.bar
foo\bar\__init__.py (1): from foo.bar.derived import Derived
foo\bar\derived.py (1): import foo.bar.base as base
AttributeError: 'module' object has no attribute 'bar'
実際、私の元のテスト コード (上部) も機能しません。インポートしようとするとすぐにfoo.bar
エラーが発生します。
このエラーからわかるのは、__init__.py
原因の import ステートメントが完全にロードderived.py
される前に実行されるため、独自の基本クラスを含むbar
モジュールを (これも から) インポートできないことです。bar
私は C++ の世界から来ました。ここでは、超ネストされた名前空間は統合されておらず、単純な前方宣言でこの問題は解消されますが、私が探していることが可能であり、少なくともある程度受け入れられるPythonicソリューション。私は何を間違っていますか?サブモジュールのクラスを親モジュールの名前空間で使用できるようにする正しい方法は何ですか?