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

标签 python python-3.x class import

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

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

相关文章:

class - 类初始化中的可选参数

class - 如何在类图中添加最终变量

python - python中2个列表的3D插值

python - Pandas - 数据系列 - TypeError : Index must be DatetimeIndex

python - jupyter-notebook:循环打印精细表格

python - Windows 上的 django-admin.py 和 virtualenv 问题

django - 如何使 Django 表单字段唯一?

python - 从 Python3 写入 "table"

python - 缺少外部依赖项的哪个异常?

python - 取决于类实例中的值