私は自分の軽量なormを構築しています。インスタンス化されたオブジェクトをクラス変数(おそらく辞書)に保持したいと思います。get(id)のようなオブジェクトを(クラスメソッドを介して)要求するとき、インスタンス化されたリストからオブジェクトを返すか、存在しない場合はオブジェクトを作成したいと思います。
オブジェクトのインスタンス化を防ぐ方法はありますか(そのIDがすでにclsリストに存在する場合)?
私は自分の軽量なormを構築しています。インスタンス化されたオブジェクトをクラス変数(おそらく辞書)に保持したいと思います。get(id)のようなオブジェクトを(クラスメソッドを介して)要求するとき、インスタンス化されたリストからオブジェクトを返すか、存在しない場合はオブジェクトを作成したいと思います。
オブジェクトのインスタンス化を防ぐ方法はありますか(そのIDがすでにclsリストに存在する場合)?
明示的なチェックを実行するだけです。これが最もクリーンな方法だと思います。
class OrmContainer(object):
objects = {}
@classmethod
def get(cls, id):
if id not in cls.objects:
cls.objects[id] = SomeOtherClass(id)
return cls.objects[id]
それには 2 つの簡単な方法があり、他にも多くの方法があります。あなたが示唆するように、それらの1つは、__new__
既存のオブジェクトを返すか、新しいインスタンスを作成できるオブジェクトのメソッドを作成することです。
別の方法は、オブジェクトにファクトリ関数を使用し、クラスの代わりにこのファクトリ関数を呼び出すことです。多かれ少なかれ次のようになります。
class _MyClass(object):
pass
def MyClass(*args, **kw):
if not "my_class_object" in all_objects:
all_objects["my_class_object"] = _MyClass(*args, **kw)
return all_objects["my_class_object"]