我有以下内容:
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 objects
,moon=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
实例。
答案 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创建全局对象分开,因为有时您可能希望执行一个而不是另一个。