类属性的值不同,具体取决于它们的访问位置(Python 3)

Syn*_*sus 3 python import class python-3.x

它似乎取决于它们的访问位置,类属性没有相同的值.我不明白为什么会这样,任何理解这个或解决它的帮助都会受到欢迎.

请考虑以下.py文件:

foo.py:

from bar import *


class Foo:
    someAttribute = None

    @classmethod
    def update(cls, value):
        cls.someAttribute = value


def main():
    Foo.update("some value")
    print(Foo.someAttribute)
    bar = Bar()
    bar.showStuff()


if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

和bar.py:

from foo import *


class Bar:

    def showStuff(self):
        print(Foo.someAttribute)
Run Code Online (Sandbox Code Playgroud)

人们会期望并打算输出对于两个print指令都是"某种值" .但我的输出如下:

$ python foo.py
some value
None
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

你有两个副本中的foo内存模块.一个叫__main__,另一个叫foo.那是因为你foo作为一个脚本运行,然后存储为__main__模块.

所以当你运行python foo.py以下情况时:

  • sys.modules['__main__'] 用于保存脚本命名空间.
  • from bar import * 运行
    • sys.modules['bar']创建以保存bar模块名称空间.
    • from foo import * 运行
      • sys.modules['foo']创建以保存foo模块名称空间.
      • from bar import *运行,sys.modules['bar']找到对象.
      • sys.modules['bar']模块中不存在任何名称,不会导入任何内容
      • Foo类和main功能被添加到foo模块.
      • if __name__ == '__main__'被跳过,这是foo模块.
    • 名称Foomain添加到bar命名空间
    • Bar班被添加到bar命名空间
  • 名称Foo,mainBar添加到__main__命名空间
  • 新对象Foomain__main__命名空间中创建.
  • if __name__ == '__main__'块被执行并且main()被调用.

__main__in 导入bar,或使用第三个 python文件作为主脚本.

请注意,如果您使用from __main__ import *,则确实存在循环导入问题.这是因为from __main__ import *from foo import *线路运行时不会包含任何尚未执行的内容,请参阅上述细分.