【问题标题】:Inherit other file.py globals继承其他 file.py 全局变量
【发布时间】:2012-08-25 03:15:03
【问题描述】:

如何从其他 .py 文件继承全局变量?

示例:
globals.py

test = 'testValue'

index.py

from globals import *

def setGlobals():
    global test
    test = 'new Value' # Setting new value to project global  

setGlobals()

help.py

from globals import *
print test # Should print out 'new Value', but it prints 'testValue'

我希望有一个文件充满常量和全局变量,这些变量由另一个文件设置并被其他文件使用。在这个例子中,我在index.py 中为全局变量test 设置了新值,并希望在help.py 中使用新值。我对 python 使用了错误的方法吗?谢谢。

编辑: 事件顺序与示例相同,例如首先我导入,设置新值,然后尝试从另一个文件打印出新设置的值。

【问题讨论】:

  • 你没有在示例程序中调用setGlobals

标签: python inheritance globals


【解决方案1】:

在 Python 中,模块是对象。当您进行导入时,您正在将一个模块的属性复制并可能重命名为当前模块。但是,这仅复制值(或更具体地说,按值复制引用)。如果稍后更改了导入的模块,则您的副本将不会更改。一种可能的方法是尝试将第二个模块中的全局变量定义为属性,但我不确定这是否有效。

但是,无论如何,您正在尝试做的是糟糕的设计。您需要重新考虑为什么要在任何地方访问和修改全局值。尝试重构您的代码并替换依赖注入留下的任何内容。例如,将全局模块替换为可以传递给需要它的任何人的配置对象。

【讨论】:

  • 依赖注入不是一种选择,我希望有一个全局变量的setter函数,它只被称为启动或怎么说..构造函数?所以,如果我有一个充满全局设计的课程会更好吗?
  • 是的。然后你只需要在启动时创建全局对象并传递它。如果创建后不对其进行修改,甚至可以将其设为命名元组。
  • 这行得通,但设计明智,是不是大错特错?我是用 c++ 长大的,这种事情还可以。
  • @krizajB:告诉你全局变量在 C++ 中没问题的人被误导了。
  • @krizajB:我从不在自己的代码中使用全局变量,一次性脚本除外。当我使用它们时,那​​是因为我被图书馆强迫,我尽量避免使用这样的图书馆。我同意 Antimony 的观点,您可能需要重新考虑您的设计。
【解决方案2】:

根据:

index.py 中,您将删除:

global test

然后你会改变:

test = 'new Value' # Setting new value to project global

收件人:

globals.test = 'new Value' # Setting new value to project global

help.py 你会改变:

print test # Should print out 'new Value', but it prints 'testValue'

收件人:

print globals.test # Should print out 'new Value', but it prints 'testValue'

我今晚实际上在做一个类似的项目,所以稍后会回来确认网站的正确性(尽管它是正确的,但这是有道理的)。

这个链接似乎证实了这一点:

顺便说一句,我有点惊讶堆栈溢出除了经常出现的“你不能那样做”的答案之外,还没有答案。我没有c++ 像您在 cmets 中那样的经验。但是我已经使用了c 和伪c#,并且为全局变量包含头文件似乎很容易,而不是应该回避。我一直在 Linux bash 中使用 source config.sh 等进行操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    相关资源
    最近更新 更多