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 になります。正しい答えがどうあるべきかはわかりませんが、2つが一貫していると思います。

4

1 に答える 1

6

Python は、メイン モジュールsys.modules['__main__']. でこの名前空間をテストしますa.py

if __name__ == '__main__'

ただし、 をb.py使用するfrom a import Fooと、新しいネームスペースが作成されsys.modules['a']ます。これらの名前空間は両方とも、 の別のコピーを持っていますFoo

を印刷するときは、別のオブジェクトであるを参照しながら、 をFoo.x印刷しています。__main__.Foo.xb.Bar.xa.Foo.x

についてc.pyは、 からインポートFooしてaいるので、 と の両方b.Barc参照しa.Fooてください。

于 2013-10-10T13:52:30.637 に答える