Python的静态变量

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

/ - 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等于无。 有什么建议么?

简化的代码:
main.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()

otherfile.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

--------------解决方案-------------

我会从我相信你的问题是与仙宫,因为你简单的例子坏工作:

  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() import asgard; asgard.Asgard.initialize()忽略条件进口的问题,我下面提),你就不会遇到这个问题,因为__main__模块将是的main.pyasgard.py只会永远和名称进口asgard 。 这会工作的另一个解决方案是if __name__ == '__main__': sys.modules['asgard'] = sys.modules['__main__']

并请, 永远不要扳指if __name__ == '__main__': import ...把戏。 这意味着,如果你试图import asgard; asgard.Asgard.initialize() import asgard; asgard.Asgard.initialize()例如,它会失败说,名称'口'是不确定的。 请把这些进口的文件,它们所属的顶部。

分类:蟒蛇 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.189 (s). 10 q(s)