根据从何处访问它们,类属性似乎不具有相同的值。我不明白为什么会这样,欢迎任何有助于理解或解决它的帮助。
考虑以下 .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
模块。
- 名称
Foo
和main
被添加到bar
命名空间 Bar
类被添加到bar
命名空间
- 名称
Foo
、main
和Bar
被添加到__main__
命名空间 - 在
__main__
命名空间中创建了新对象Foo
和main
。 - 执行
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/