任何人都可以解释这个python静态类变量的情况吗?

时间:2013-10-10 13:29:16

标签: python

我有以下模块:

档案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。我不确定答案应该是什么,但我希望这两者能够保持一致。

1 个答案:

答案 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.Barc都会引用a.Foo