4

我有以下模块:

文件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。我不确定正确的答案应该是什么,但我希望两者保持一致。

4

1 回答 1

6

Python 为主模块创建一个单独的命名空间,sys.modules['__main__']. 您在以下位置测试此命名空间a.py

if __name__ == '__main__'

但是,当b.pyuses时,会创建from a import Foo一个sys.modules['a']的命名空间, . 这两个命名空间都有一个单独的Foo.

当您 print 时Foo.x,您正在打印__main__.Foo.x,而b.Bar.x指的是a.Foo.x,这是一个不同的对象。

对于c.py,您是从 导入Fooa,所以两者都b.Bar参考c那里a.Foo

于 2013-10-10T13:52:30.637 回答