gpt4 book ai didi

python - 类属性根据访问位置不同而具有不同的值 (Python 3)

转载 作者:太空宇宙 更新时间:2023-11-03 13:33:45 25 4
gpt4 key购买 nike

根据从何处访问它们,类属性似乎不具有相同的值。我不明白为什么会这样,欢迎任何有助于理解或解决它的帮助。

考虑以下 .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()

和 bar.py:

from foo import *


class Bar:

def showStuff(self):
print(Foo.someAttribute)

对于两个 print 指令,人们会期望并希望输出是“某个值”。然而我的输出如下:

$ python foo.py
some value
None

最佳答案

内存中有 两个 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 命名空间
  • 名称 FoomainBar 被添加到 __main__ 命名空间
  • __main__ 命名空间中创建了新对象 Foomain
  • 执行 if __name__ == '__main__' block 并调用 main()

要么从 bar 中的 __main__ 导入,要么使用 third python 文件作为主脚本。

请注意,如果您使用 from __main__ import *,那么您确实遇到了循环导入问题。这是因为 from __main__ import * 不会包含 from foo import * 行运行时尚未执行的任何内容,请参见上面的分解。

关于python - 类属性根据访问位置不同而具有不同的值 (Python 3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42598903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com