gpt4 book ai didi

Python 静态变量

转载 作者:行者123 更新时间:2023-11-28 23:03:52 26 4
gpt4 key购买 nike

我正在创建一个使用基类来保存所有配置值、导入方法等的应用程序。

/
- application.py
+ class foo
+ config = None
+ def loadconfig
- otherfile.py
+ class bar
+ def getconfigvalue

因此,如果我启动 application.py 并运行 loadconfig,它将一个值加载到 foo.config,然后导入 (在所述函数内 - 绕过循环导入)otherfile.py 并创建一个新的 bar 对象,然后尝试从 foo.config< 获取配置值,但表示 foo.config 等于 None。有什么建议吗?

简化代码:
ma​​in.py

class Main:
config = None
@staticmethod
def start():
## Load the configuration from a file, creating a dict in Main.config ##
Main.other()

@staticmethod
def other():
from otherfile import otherclass
otherclass()

Main.start()

其他文件.py

from main import Main
class otherclass:
def __init__(self):
print(Main.config) ## Prints "None"

注意:之所以这样安排是因为它在程序中实际是这样工作的;感觉跟作用域有关系

完整源文件:
asgard.py: http://pastebin.com/jRkWzrPq
库/childcontainer.py:http://pastebin.com/6a561Nun

最佳答案

我将从我认为您的问题与 asgard 相关的方面开始工作,因为您的简化示例已损坏:

  1. 由于循环导入,您无法运行 main.py,但我相信它是您打算运行的 main.py(运行 otherfile .py 不会显示我相信您遇到的问题)。
  2. 您实际上从未将任何内容分配给 Main.config。我不确定您打算分配给它的确切位置。

无论如何,继续 asgard.py

这里遇到模块__main__的问题。当你运行asgard.py时,它的__name____main__;您可能不知道的是,这实际上是它在 sys.modules 中出现的模块名称 - 主模块是 sys.modules['__main__'],不是 sys.modules['asgard']。然后,当您导入 library.childcontainer 时,它会尝试导入 asgard。这会查找 sys.modules['asgard'],它不存在,因此它将 asgard.py 的内容导入到一个新的模块对象中。

如果您有另一个文件 main.py 确实 import asgard; asgard.Asgard.initialize()(忽略我在下面提到的条件导入问题),你不会遇到这个问题,因为 __main__ 模块是那个 main. py,而 asgard.py 只会以名称 asgard 导入。另一个可行的解决方案是 if __name__ == '__main__': sys.modules['asgard'] = sys.modules['__main__']

拜托,拜托拜托永远不要拉那个if __name__ == '__main__': import .. . 把戏。这意味着如果您尝试 import asgard; asgard.Asgard.initialize(),例如,它会失败说名字'os'是未定义的。请将这些导入放在文件的顶部,它们所属的位置。

关于Python 静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8253095/

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