2012-05-01 26 views
1

Google App Engineでエラーが発生しましたが、わかりません。 、「車」クラスを含むファイル「Car.py」を含むモジュール「X」を考えるPythonの "import X"と "from module import X"の違いは?

とのコードブロックを与えられた:

import X 

class Passenger(db.Model): 
    car = db.ReferenceProperty(X.Car.Car) 

私はエラーを取得する:

AttributeError: 'module' object has no attribute 'Car' 

しかし、私はそれを変更した場合:

from X import Car 

class Passenger(db.Model): 
    car = db.ReferenceProperty(Car.Car) 

それは動作します。彼らは私に同じように見えるが、明らかにそうではない。違いは何ですか?

+0

Xは、ここではモジュールではありませんそれはパッケージです。 –

答えて

3

Latitudewareが指摘しているように、Xはパッケージであり、これはパッケージの動作方法です。外部レベルをインポートしても、そのモジュール内のモジュールに自動的にアクセスするわけではありません。全体をX.Car.Carと呼ぶ場合は、import X.Carとすることができます。

(また、Pythonのは、Javaではない点に注意してください。。そこに別のファイル内の各クラスを持っている理由はませんし、あなたがして行う場合でも、モジュールやパッケージは、通常は小文字の名前を持つ)

+0

ありがとう、ダニエル - 私はPythonを初めて使いました。これは役に立ちます。私はクラスを自分のファイルに保つのに慣れていますが、構文は*そのようには非常に厄介です。 – marclar

1

ここで問題となるのは、パッケージXがロードされるときに、モジュールが含まれていても、名前空間にないことです。

モジュールをパッケージのネームスペースに入れるには、パッケージの__init__.pyファイルにimport module(ここではmoduleが当然モジュールの名前です)を追加します。それはパッケージの名前空間にあり、Carにアクセスする最初の方法を使用できます。

+0

ありがとう、Lattyware; Danielに言及されているように、私はPythonを初めて使い、明らかに命名法を持っていません。私は__init__.pyを使って各モジュールをインポートするというトリックを見つけましたが、それは参考になりました。 – marclar

関連する問題