Python的"import X"和"from module import X"的区别?



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

并给定此代码块:

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)

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

正如

Lattyware指出的那样,X是一个包,这就是包的工作方式。导入外部级别不会自动授予您访问其中的模块的权限。如果你想把整个事情称为X.Car.Car,你可以做import X.Car

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

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

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

最新更新