Python 如何实例化变量?

Python 如何实例化变量?,python,database,instance,Python,Database,Instance,我有以下资料: 物体 __初始值 define.py 定义.py: class Place: def __init__(self,name,inhabitants): self.name=name self.inhabitants=inhabitants myFunction.toStoreThings.on.db(name,inhabitants,'places') def someUsefulFunction

我有以下资料:

  • 物体
    • __初始值
    • define.py
定义.py

 class Place:
     def __init__(self,name,inhabitants):
         self.name=name
         self.inhabitants=inhabitants
         myFunction.toStoreThings.on.db(name,inhabitants,'places')
     def someUsefulFunction(self):
         pass
# myFunction() creates a dictionary `objdic` of the stuff in the database
# >>>objects.objdic
# {'places' : [['Moon',[]]]}
instancesdic={}
instancesdic['places']={}
instancesdic['places'][objdic['places'][0][0]]=Place(*objdic['places'][0])
如果我运行
import objects
moon=objects.Place('moon',[])
,请关闭解释器并再次打开它。显然,我丢失了
moon
实例,但我在数据库中存储了
(u'moon',u'[])
。我已经让
\uuu init\uuuuuuuuuuupy
从数据库中检索该信息并
解除对它的排序,但是我也希望它将
'Moon'
实例化为
Moon=Place('Moon',[])
,这样即使在我关闭解释器之后,我也可以使用
Moon.someUsefulFunction()
objects.Moon.someUsefulFunction()
。我怎样才能做到这一点


我可以这样做:

\uuuu init\uuuuu.py

 class Place:
     def __init__(self,name,inhabitants):
         self.name=name
         self.inhabitants=inhabitants
         myFunction.toStoreThings.on.db(name,inhabitants,'places')
     def someUsefulFunction(self):
         pass
# myFunction() creates a dictionary `objdic` of the stuff in the database
# >>>objects.objdic
# {'places' : [['Moon',[]]]}
instancesdic={}
instancesdic['places']={}
instancesdic['places'][objdic['places'][0][0]]=Place(*objdic['places'][0])

>>> objects.instancesdic
{'places': {'Moon': <objects.Place instance at 0x1b29248>}}
这没关系,但我确实想要
objects.Moon.someUsefulFunction()
。任何试图称之为月亮的行为都会导致:

TypeError: 'str' object does not support item assignment

或者,只需将字典中的键更改为实例,而不是创建的
Moon
实例。

您可以使用
setattr
函数设置
对象
模块上的模块属性,也可以更新该模块中的
全局属性。因此,在
\uuuu init\uuuuu.py
中,您可以执行以下操作:

objDict = {obj[0]: Place(*obj) for obj in objdict['places']}
globals().update(objDict)
这将允许您执行
object.Moon
等操作

不过,也有一些危险需要注意。如果您的任何对象与已在
对象
中创建的任何其他对象具有相同的名称,它们将覆盖这些对象。因此,如果
objects
有一个名为
myFunc
的函数,然后您创建一个名为
myFunc
的对象,它可能会用该对象覆盖该函数。(这将覆盖它,这取决于您的操作顺序。)


出于这个原因,在
\uuuu init\uuuuuu.py
中自动执行此操作可能不是一个好主意。为了在交互式解释器中易于使用,这样做是有意义的,但是如果在脚本中使用globals,以这种方式修改globals会变得很难看。最好创建一个名为
initGlobals
的函数,然后调用该函数来设置交互式环境。如果您将上面显示的代码放入这样一个函数中,然后调用它,它将设置环境。这使您可以将模块的简单导入与从db实际创建全局对象分开,因为有时您可能希望执行其中一项操作,但不希望执行另一项操作。

您可以使用
setattr
函数在
对象
模块上设置模块属性,或者您可以在该模块内更新
全局
。因此,在
\uuuu init\uuuuu.py
中,您可以执行以下操作:

objDict = {obj[0]: Place(*obj) for obj in objdict['places']}
globals().update(objDict)
这将允许您执行
object.Moon
等操作

不过,也有一些危险需要注意。如果您的任何对象与已在
对象
中创建的任何其他对象具有相同的名称,它们将覆盖这些对象。因此,如果
objects
有一个名为
myFunc
的函数,然后您创建一个名为
myFunc
的对象,它可能会用该对象覆盖该函数。(这将覆盖它,这取决于您的操作顺序。)


出于这个原因,在
\uuuu init\uuuuuu.py
中自动执行此操作可能不是一个好主意。为了在交互式解释器中易于使用,这样做是有意义的,但是如果在脚本中使用globals,以这种方式修改globals会变得很难看。最好创建一个名为
initGlobals
的函数,然后调用该函数来设置交互式环境。如果您将上面显示的代码放入这样一个函数中,然后调用它,它将设置环境。这使您可以将模块的简单导入与从db实际创建全局对象分开,因为有时您可能想做其中一个,但不想做另一个。

代码工作正常,现在我明白最好不要做我试图做的事情。那我还是用字典吧。谢谢。代码运行了,现在我明白了最好不要做我想做的事情。那我还是用字典吧。非常感谢。