2016-12-11 37 views
0

私は次のように書くことができるようにパッケージを実装する必要があります。モジュール/パッケージ内のオブジェクトを公開する方法は?

私のモジュールをマーケットといいます。バナナとアップルは

import market as mk 

B = mk.Banana(0.99) 
A = mk.Apple(1.10) 
A.buy() 
B.buy() 

です:それは、私は次のコードを書くことができるようにしたい私のgoShopping.pyでgoShopping.py

と呼ばれる私のPythonスクリプトの作業ディレクトリ内のフォルダです私のモジュールのいくつかのファイルのオブジェクト。

モジュール市場はどのように書かれますか?

modulesフォルダにfruits.pyという名前のファイルがあるとします。そこで、私はBananaとAppleのクラスを定義します。 私は次のように私は上記のコードを書くことができます知っている:

import market.fruits as mk 

B = mk.Banana(0.99) 
A = mk.Apple(1.10) 
A.buy() 
B.buy() 

しかし、私はそれを望んでいません。私はこのような__init__.pyでいくつかの宣言(市場フォルダ内__init.py)持っていることについて考えた解決策として

:ラインから

AttributeError: module 'market' has no attribute 'Banana' 

from fruits import Apple,Banana. 

は、しかし、私は次のエラーを取得します:

B = mk.Banana(0.99) 

どのように構造化し、どのようなshou私は私が望むようにオブジェクトを公開できるように書くのですか?

私はPythonista for iOSを使用しています。これが問題なのかなと思います。

+0

あなたが持っているものはうまくいくはずです。どのように果物をAppleから輸入し、バナナが失敗したのか - エラーメッセージは何ですか?一般に、Pythonのすべての名前は、モジュール名やパッケージ名を含めて大文字と小文字が区別されます。 PEP-8はすべての小文字を使用することをお勧めします。これは、対応するファイル/フォルダ名もそのようにする必要があることを意味します。 – martineau

+0

@martineau質問を私のエラーメッセージで更新しました。私のクラス名だけが大文字です – zeh

+0

'B = mk.Banana(0.99)'という行にはエラーがありますが、 '__init __。py'では' from fruits imported Apple、Banana'の行にエラーが発生するのは奇妙です。'import'行の直後に' print(Banana) 'を追加し、エラーが発生するかどうかを確認してください。 – martineau

答えて

0

モジュール/スクリプトがインポートされていない可能性があります。これでエラーメッセージは表示されません。 'xyz'という名前のモジュールをインポートしようとすると、アクセスしようとしない限り、エラーは発生しません。

おそらく、モジュールはスクリプトと同じフォルダにないか、__init__.pyスクリプトを含むサブディレクトリにありません。

スクリプトは、自分と同じフォルダ内の任意のモジュールをインポートできる必要があります。パッケージからモジュールをインポートすることもできます。パッケージとは、1つ以上のPythonモジュールを含むフォルダと、このフォルダをパッケージとしてマークする__init__.pyという特別なモジュールです。パッケージフォルダはPYTHONPATHにあるか、現在の作業ディレクトリのサブディレクトリでなければならないので、Pythonはそれを見つけることができますが、サブパッケージフォルダは見つけられません。

this articleを確認してください。これはどのように動作するのかをよく説明しています。