2012-01-17 5 views
22

私は.pyのファイルを含むディレクトリを持っています。各ファイルはいくつかのクラスを定義します。私はまた、ディレクトリに空の__init__.pyを持っています。例えばモジュールには属性がありません

myproject 
    __init__.py 
    mymodule 
     __init__.py 
     api.py 
     models.py 
     views.py 

私はmymoduleをインポートし、すべてのこれらのファイルで定義されたクラスにアクセスしようとしています:

from myproject import mymodule 

print mymodule.api.MyClass 

それはmymoduleは何の属性apiを持っていないことを言って、私にエラーを与えます。どうして?そして、なぜ私はファイル(models.py)のうちの1つにしかアクセスできず、他のものにアクセスできないのですか?

In [2]: dir(banners) 
Out[2]: 
['__builtins__', 
'__doc__', 
'__file__', 
'__name__', 
'__package__', 
'__path__', 
'models'] 

答えて

28

サブモジュールは自動的にインポートされないという問題があります。 myproject.mymoduleをインポートするときに、あなたが本当に利用可能apiを主張する場合は、myproject/mymodule/__init__.pyでこれを置くことができ

import myproject.mymodule.api 
print myproject.mymodule.api.MyClass 

:あなたは、明示的にapiモジュールをインポートする必要が

import myproject.mymodule.api 

その後、これは期待通りに動作します。

from myproject import mymodule 

print mymodule.api.MyClass 
1

モジュールはそれほど機能しません。

from myproject.mymodule import api 
print api.MyClass 
+0

私はそれを行うことができます。点線の名前を使用することは可能ですか? – akonsu

+2

@akonsuの場合は、単に 'import myproject.mymodule.api'を実行して、' myproject.mymodule.api.MyClass'を通してそれにアクセスしてください。 –

+0

まあ、これは一般的に言えば、私のコードをどのように動かすことができるのかということではないと思います。私はこれが達成できるかどうか不思議です。私はそれが主要な 'myproject'なしで 'mymodule.api ...'を通して私のクラスにアクセスできるようにすることはできますか? – akonsu

2

myprojectディレクトリにも__init__.pyが必要です。したがって、モジュールの構造は次のようになります。

myproject 
    __init__.py 
    mymodule 
     __init__.py 
     api.py 
     models.py 
     views.py 
+1

はい、ありがとうございました。 – akonsu

関連する問題