1

我有以下内容:

  • 对象
    • __init__.py
    • 定义.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

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


我能够这样做:

__init__.py

# 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创建实例。

4

1 回答 1

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,然后调用该函数来设置您的交互式环境。如果你把我上面展示的代码放入这样的函数中,然后调用它,它将设置环境。这使您可以将模块的简单导入与从数据库中实际创建全局对象分开,因为有时您可能想要做一个而不是另一个。

于 2013-06-01T18:24:08.923 回答