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
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实际创建全局对象分开,因为有时您可能想做其中一个,但不想做另一个。代码工作正常,现在我明白最好不要做我试图做的事情。那我还是用字典吧。谢谢。代码运行了,现在我明白了最好不要做我想做的事情。那我还是用字典吧。非常感谢。