1

私は次のものを持っています:

  • オブジェクト
    • __init__.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()


私はこのようにすることができました:

__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その関数を呼び出してインタラクティブな環境を設定することをお勧めします。上記のコードをそのような関数に入れて呼び出すと、環境がセットアップされます。これにより、モジュールの単純なインポートを実際に db からグローバル オブジェクトを作成することから切り離すことができます。

于 2013-06-01T18:24:08.923 に答える