0

我正在寻找可以使对象全局化的代码。我正在寻找的是 - 假设有一个文件 xyz.py 有代码

import some_module

class classname:
    def __init__():
        pass

    def createobj():
        some_module_obj = some_module()

还有另外两个文件 1.py 和 2.py 有代码 1.py

import xyz

obj =  classname()
obj.sayhi()

2.py

import xyz

obj.sayhi()

我想在 2.py 中使用相同的对象,在 1.py 中创建一次

任何人都可以帮助我知道我该如何实现这一目标。

谢谢, 维普尔

4

2 回答 2

1

2.py

import xyz
print xyz.obj

或者

from xyz import obj
print obj
于 2013-10-14T14:39:09.970 回答
0

您不能创建一个已知名称并在所有模块中引用同一对象。每个模块都有自己的global命名空间。

但是您当然可以通过使用限定名来访问其他模块的命名空间。

编辑:

1使用类似(即在名为 的文件中)或类似的模块名称1.py不是一个好主意,因为数字不能用作标识符。像这样的限定名称1.obj是语法错误。所以我将使用这些文件one.pytwo.py然后我可以one.obj毫无问题地访问。

如果在文件中one.py你有类似的东西

obj = "foo"

然后你可以在文件中导入它two.py

import one
print one.obj  # or use it any way you like

如果你像这样导入它:

from one import obj

然后你仍然会有相同的对象:

print obj == one.obj  # will print True (they are equal)
print obj is one.obj  # will print True (they are the same)

但在另一个名为 obj 的变量中:

obj = "bar"
print obj, one.obj  # will print "bar foo"

这两个变量不相同仅在您将某物分配给它们的情况下才重要。

因此,如果您希望能够更改值(并使更改对所有使用模块生效),您可以在任何one.obj地方使用限定名称 ( ):

import one
one.obj = "bar"

或者,您可以更改现有值,而不是为变量分配新值。这也将对所有使用模块产生影响:

one.py

obj = [ "foo" ]

two.py

from one import obj
obj[0] = "bar"

one.py即使我们obj是一个不同的变量,这也会产生影响,one.obj因为两个变量都引用同一个列表。

如果可能的话,我当然会建议使用使用限定名称的版本,因为引用的东西隐藏了机制,并且可能会让下一个开发人员感到惊讶。

于 2013-10-14T14:26:09.603 回答