2016-10-21 15 views
0

Pythonにパッケージとモジュールを提供することになると、私は新しい仲間です。 私はいくつかの別のコンパートメントでスクリプトをカットしようとしています。読みやすさと保守性を向上させます。モジュールからインポートされた関数は、このモジュールのクラスにアクセスできますか?

私の問題は以下の通りです:

私はクラスと、このクラスをインスタンス化し、このモジュール内の関数を定義するモジュールを持っています。 モジュールblast.py

class Blast(): 
    blabla 

def foo(): 
    blast = Blast() 
    # do some stuff 

は、このモジュールは私がその機能を使用する場合、使用する主なスクリプトを持っている_ _init__.pyファイル

__all__ = ["blast"] 

でパッケージ内にあります。 私は(少なくとも私のIDEは私がと言う:pycharm)私は、モジュールの名前空間を使用する必要があり、その関数を使用するには

from package import blast 

でモジュールをインポートしかし、だから、それが動作し

blast.foo() 

?関数はモジュール内のクラスを見ますか?

さらに一般的には、私の名前空間内に私のパッケージのいくつかの機能をインポートできますか?私はそれがこのように行われ、私がインターネットから得た答えは本当に私を助けないが。

+0

あなたの質問に答えた場合、私の回答が – nlsdfnbch

+0

に役立つかどうかを確認してください。 – nlsdfnbch

答えて

0

はい、関数blast.foo()は、クラスBlastを認識しています。

モジュールの一部または全部をインポートすると、モジュール全体がロードされます。インポートする方法は、現在のスコープで使用できるクラスと関数を決定するだけです。例えば

、あなたがこの呼び出す場合:

from package.blast import foo 

を唯一の機能foo()が利用可能になりますが、パッケージ全体が読み込まれ、ロードされました。同じスクリプトでクラスBlastを単独でインスタンス化しようとすると、これはうまくいかないでしょう。

ちなみに、__init__.pyをカスタマイズすると、インポート機能をより便利にすることができます。あなたのケースでは、あなたがそうのようにそれを編集した場合、:

>>>__init__.py 
from blast.py import Blast, foo 

あなたがそうのような関数やクラスの両方をインポートすることができます。

from package import Blast, foo 

あなたは__all__パラメータが動作しない理由、それからです予想通り、あなたの現在の__init__.pyが動作するはずでこれを呼び出す

from package import * 

:主にこの - 別のインポート文が必要です。

おそらくthis post by Mike Grouchyはもう少し物事を明確にすることができます。

+0

ほとんどのものよりもはっきりとした説明は、インターネットのおかげで見つける。 –

関連する問題