让我说我有这样的事情:
. ├── run.py └── test ├── __init__.py ├── models │ ├── foo │ │ ├── baby.py │ │ └── __init__.py │ ├── __init__.py │ └── user.py └── start.py
run.py
from test import start
start.py
from .models import user
user.py
from . import foo
print(foo.baby.Baby)
baby.py
Baby = "I am a baby"
现在,当您运行run.py
文件...
>>> python run.py
... traceback ...
AttributeError: 'module' object has no attribute 'baby'
但是,如果你像这样更改start.py
:
from .models.foo import baby
from .models import user
一切正常。
如果先前未加载baby
中的start.py
模块,则foo
包对象没有对它的引用(foo.baby.Baby
抛出AttributeError
})。但是当我在baby
中加载start.py
模块时,foo
包对象会自动获得对baby
模块的引用。
有人可以解释一下这是如何运作的吗?
答案 0 :(得分:6)
在导入之前,子模块不是包的自动属性。
在test.models.foo.baby
工作之前,您需要先导入foo.baby.Baby
。您可以在foo/__init__.py
文件中执行此操作:
from . import baby