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 的第一种方法。