Python的“import X”和“from module import X”之间的区别?

时间:2012-05-01 16:44:25

标签: python google-app-engine

Google App Engine刚给我一个我不明白的错误。给定模块“X”,其中包含文件“Car.py”,其中包含“Car”类,

并给出了这段代码:

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)

有效。它们看起来和我一样,但它们显然不是。有什么区别?

2 个答案:

答案 0 :(得分:3)

正如Lattyware所指出的,X是一个包,这就是包的工作方式。导入外层并不会自动访问其中的模块。如果您想将整个事件称为import X.Car,则可以X.Car.Car

(另请注意Python不是Java:没有理由将每个类放在一个单独的文件中,即使你这样做,模块和包通常都有小写名称。)

答案 1 :(得分:1)

这里的问题是,当加载包X时,它包含模块,但它们不在它的命名空间中。

要将模块放入包的命名空间,请将import module(其中module是模块的名称,自然地)添加到包的__init__.py文件中。它将在包的命名空间中,您可以使用第一种访问Car的方式。