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)
你有两个副本中的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__命名空间Foo并main在__main__命名空间中创建.if __name__ == '__main__'块被执行并且main()被调用.从__main__in 导入bar,或使用第三个 python文件作为主脚本.
请注意,如果您使用from __main__ import *,则确实存在循环导入问题.这是因为from __main__ import *当from foo import *线路运行时不会包含任何尚未执行的内容,请参阅上述细分.