我有以下模块:
档案a.py
class Foo(object):
x = 5
if __name__ == '__main__':
print Foo.x #5
Foo.x = 7
print Foo.x #7
b = __import__('b')
print b.Bar.x #5
档案b.py
from a import Foo
class Bar(Foo):
pass
档案c.py
if __name__ == '__main__':
import a
print a.Foo.x #5
a.Foo.x = 7
print a.Foo.x #7
b = __import__('b')
print b.Bar.x #7
如果我运行a.py,我得到5,7,5如果我运行b.py,我得到5,7,7。我不确定答案应该是什么,但我希望这两者能够保持一致。
答案 0 :(得分:6)
Python为主模块sys.modules['__main__']
创建一个单独的命名空间。您可以在a.py
:
if __name__ == '__main__'
但是,当b.py
使用from a import Foo
时,会创建一个新命名空间sys.modules['a']
。 这两个名称空间都有Foo
的单独副本。
当您打印Foo.x
时,您正在打印__main__.Foo.x
,而b.Bar.x
指的是a.Foo.x
,这是另一个对象。
对于c.py
,您要从Foo
导入a
,因此b.Bar
和c
都会引用a.Foo
。