3

假设我有这样的事情:

.
├── 运行.py
└── 测试
    ├── __init__.py
    ├── 型号
    │ ├── foo
    │ │ ├── baby.py
    │ │ └── __init__.py
    │ ├── __init__.py
    │ └── user.py
    └── start.py

运行.py

from test import start

开始.py

from .models import user

用户.py

from . import foo

print(foo.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.Babythrow an AttributeError)。但是当我在中加载baby模块时start.pyfoo包对象自动获得了对baby模块的引用。

有人可以解释一下这是如何工作的吗?

4

1 回答 1

6

在导入之前,子模块不会自动成为包的属性。

您需要先导入test.models.foo.baby 才能工作foo.baby.Baby。您可以在foo/__init__.py文件中执行此操作:

from . import baby
于 2013-04-24T20:02:16.653 回答