我正在構建自己的輕量級orm。我想保持實例化對象在一個類變量(也許是一個字典)。當我通過一個類方法請求一個對象時,比如get(id),我想從實例化的列表中返回對象,或者創建一個不存在的對象。我應該使用__new__來防止實例化嗎?
有沒有辦法阻止對象的實例化(如果它的ID已經存在於CLS列表中)?
我正在構建自己的輕量級orm。我想保持實例化對象在一個類變量(也許是一個字典)。當我通過一個類方法請求一個對象時,比如get(id),我想從實例化的列表中返回對象,或者創建一個不存在的對象。我應該使用__new__來防止實例化嗎?
有沒有辦法阻止對象的實例化(如果它的ID已經存在於CLS列表中)?
有做兩個簡單的方法 - 等多種途徑,也是如此。正如你所建議的,其中之一就是爲你的對象編寫__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"]
只是進行明確的檢查,這是最乾淨的方法,我相信:
class OrmContainer(object):
objects = {}
@classmethod
def get(cls, id):
if id not in cls.objects:
cls.objects[id] = SomeOtherClass(id)
return cls.objects[id]