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)
有效。它们看起来和我一样,但它们显然不是。有什么区别?
答案 0 :(得分:3)
正如Lattyware所指出的,X
是一个包,这就是包的工作方式。导入外层并不会自动访问其中的模块。如果您想将整个事件称为import X.Car
,则可以X.Car.Car
。
(另请注意Python不是Java:没有理由将每个类放在一个单独的文件中,即使你这样做,模块和包通常都有小写名称。)
答案 1 :(得分:1)
这里的问题是,当加载包X时,它包含模块,但它们不在它的命名空间中。
要将模块放入包的命名空间,请将import module
(其中module
是模块的名称,自然地)添加到包的__init__.py
文件中。它将在包的命名空间中,您可以使用第一种访问Car的方式。