Если вы изменили ваш subtwo.py таким образом, он будет работать
import subone
print subone.a
Когда вы выполняете subone.a в subtwo.py, вы пытаетесь получить доступ к subone пространства имен в subtwo.py и вв пространстве имен «subone» должен быть атрибут «a».
Когда вы делаете - импортируете subone в subtwo.py, тогда subone добавляется в пространство имен, и у пространства имен subone есть атрибут a.так что subone.a будет работать.
Я бы также посоветовал вам поиграть с dir (), чтобы увидеть, как добавляются пространства имен.
В subtwo.py вы можете сделать следующее:
print dir()
import subone
print dir()
print subone.a
Аналогично, попробуйте добавить «print dir ()» до и после ваших операторов импорта, и идея должна стать вам понятной.
«import x» добавляет «x»в текущее пространство имен модулей, в то время как "из x import *" добавит все атрибуты уровня модуля непосредственно в текущее пространство имен модулей
Так что в приведенном выше первом примере main.py, subone.pyи subtwo.py, пространство имен в main.py будет содержать «subone» и «subtwo», тогда как subtwo.py будет иметь пустое пространство имен и не сможет получить доступ к subone.a.
[Редактировать: Некоторыедополнительные объяснения] Рассмотрим следующие файлы: main.py
print "Before importing subone : ", dir()
import subone
print "After importing subone and before importing subtwo: ", dir()
import subtwo
print "After importing subone and subtwo: ", dir()
subone.py
a = 'abc'
subtwo.py
print dir()
import subone
print "module level print: ", subone.a
print dir()
def printX():
print subone.a
И вывод работающей main.py:
Before importing subone : ['__builtins__', '__doc__', '__file__', '__name__', '__package__']
After importing subone and before importing subtwo: ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'subone']
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
module level print: abc
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'subone']
After importing subone and subtwo: ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'subone', 'subtwo']
Некоторые наблюдения
- Вы не будетеОбратите внимание, что при импорте модуля subtwo.py оператор print выполняется немедленно.
- Таким образом, когда subone и subtwo импортируются в main.py, пространство имен main.py увеличивается.
- Это не означает, что пространство имен subtwo будет увеличено.так что «a» доступно только в main.py через subone.a
- Когда мы импортируем subone в subtwo.py, тогда пространство имен subtwo увеличивается с помощью subone, а атрибут a модуля subone доступен в subtow.py через subone.a