2012-05-22 90 views
2

我正在構建自己的輕量級orm。我想保持實例化對象在一個類變量(也許是一個字典)。當我通過一個類方法請求一個對象時,比如get(id),我想從實例化的列表中返回對象,或者創建一個不存在的對象。我應該使用__new__來防止實例化嗎?

有沒有辦法阻止對象的實例化(如果它的ID已經存在於CLS列表中)?

回答

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"] 
1

只是進行明確的檢查,這是最乾淨的方法,我相信:

class OrmContainer(object): 
    objects = {} 

    @classmethod 
    def get(cls, id): 
     if id not in cls.objects: 
      cls.objects[id] = SomeOtherClass(id) 
     return cls.objects[id] 
相關問題