2014-01-28 4 views
0

Python автоматически не импортирует подпакеты или модули. Мы должны сделать это явно, Но почему Django автоматически импортирует подмодуль пакета.django автоматически импортирует модуль пакета,

users/ 
    __init__.py (empty file) 
    models.py 
    views.py 

в Python manage.py оболочки Джанго:

>>>import users 
    >>>users.models.User  (will not throw AttributeError: 'module' object has no attribute) 

Но если не в Django:

package1/ 
    __init__.py (empty file) 
    module1.py 
    >>>import package1 
    >>>package1.module1 
    AttributeError: 'module' object has no attribute 'module1' 

Может кто-нибудь объяснить разницу? Thank you

ответ

1

Сценарий manage.py настраивает среду Django перед передачей управления оболочке Python. Оболочка не является отдельным вызовом исполняемого файла python; он выполняется тем же интерпретатором Python, который запускает сам скрипт manage.py. В момент, когда оболочка вызывается, Django уже загрузил свою конфигурацию и инициализировал все разрешенные приложения, поэтому все их подмодули models.py уже загружены.

Когда один и тот же модуль импортируется в нескольких местах (например, import users), он не загружается несколько раз; сам экземпляр модуля будет таким же во всех местах, где он импортируется. Поскольку сам Django уже импортировал users.models во время его инициализации, существующий экземпляр модуля users уже содержит ссылку на уже импортированный подмодуль users.models, и вы можете получить к нему доступ сразу, не импортируя его явно.

Смежные вопросы