如何使对象或实例全局化

时间:2013-10-14 14:21:50

标签: python

我正在寻找一个可以使对象全局化的代码。 我正在寻找的是 - 假设有一个文件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

中创建一次的2.py中使用相同的对象

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

谢谢, Vipul

2 个答案:

答案 0 :(得分:1)

2.py

import xyz
print xyz.obj

from xyz import obj
print obj

答案 1 :(得分: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生效,因为两个变量都引用相同的列表。

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