如果您以这种方式修改了subtwo.py,那么它将起作用
import subone
print subone.a
当你在subtwo.py中执行subone.a时,你试图访问subtwo.py和命名空间“subone”中的命名空间subone,应该有一个属性“a”.
当你这样做 – 在subtwo.py中导入subone时,subone被添加到命名空间,subone命名空间有属性a.所以subone.a会起作用.
我还建议您使用dir()来查看如何添加命名空间.
在subtwo.py中,您可以执行以下操作:
print dir()
import subone
print dir()
print subone.a
同样,尝试在import语句之前和之后添加“print dir()”,这个想法应该变得清晰.
“import x” adds ‘x’ to the current modules
namespace while “from x import * ” will
add all the module level attributes
directly into current module namespace
所以在上面的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']
Some Observations
>您会注意到导入模块subtwo.py,会立即执行print语句.>因此,当在main.py中导入subone和subtwo时,main.py的命名空间会被扩充.>这并不意味着将增加subtwo的命名空间.所以“a”只能通过subone.a在main.py中使用>当我们在subtwo.py中导入subone时,subwo的命名空间用subone增加,而subow.py中的module subone属性可通过subone.a获得.