ここに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ソリューション。私は何を間違っていますか?サブモジュールのクラスを親モジュールの名前空間で使用できるようにする正しい方法は何ですか?