如何实例化变量?

时间:2013-06-01 18:14:41

标签: python database instance

我有以下内容:

  • 对象
    • __初始化__。PY
    • define.py

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

如果我运行import objectsmoon=objects.Place('Moon',[]),请关闭解释程序并再次打开它。我显然放松了moon实例,但我在数据库中存储了(u'Moon',u'[]')。我已经__init__.py从数据库和unstring检索了该信息,但我也希望将'Moon'实例化为Moon=Place('Moon',[]),以便我可以使用Moon.someUsefulFunction()即使我关闭翻译后,我还是objects.Moon.someUsefulFunction()。我怎样才能做到这一点?


我能够这样做:

__初始化__吡啶

# 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.instancesdic['places']['Moon'].someUsefulFunction()

哪个好,但我真的很想objects.Moon.someUsefulFunction()。任何调用整个事件Moon的尝试都会导致:

TypeError: 'str' object does not support item assignment

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

1 个答案:

答案 0 :(得分:1)

您可以使用setattr函数在objects模块上设置模块属性,也可以在该模块中更新globals。所以在__init__.py你可以做到:

objDict = {obj[0]: Place(*obj) for obj in objdict['places']}
globals().update(objDict)

然后,您可以执行object.Moon等等。

但是,有一些危险需要注意。如果您的任何对象与objects中已创建的任何其他对象具有相同的名称,则它们将覆盖这些内容。因此,如果objects有一个名为myFunc的函数,然后您创建了一个名为myFunc的对象,它就可以用该对象覆盖该函数。 (这将覆盖哪些取决于你做的事情的顺序。)

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