2013-10-22 52 views
0

假設我正在KV數據存儲中創建表示和對象的類。創建構造非常簡單...從類方法構造

class KVObject: 
    def __init__(self, key, value, add=True): 
     self.key = key 
     self.value = value 
     if add == True: 
      kv_create(key, value) 

現在,讓我們說,我想檢索KV-對象...並從中構建一個類的實例。我想我會將這個類方法添加到我的DataBaseObject類。

 @classmethod 
    def get_kv_object(cls, key): 
     value = kv_get(key) 
     cls.__init__(key, value, add=False) 

...但是從類方法調用初始化(CLS .__ init__),Python的請求參數的自我!

任何想法?非常感謝!我知道這是一個簡單的例子,但它絕對適用於一些更復雜,有趣的情況!

編輯:感謝您的回覆。在研究這件事時,我學到了一些有用的東西,就是那個對象.__ new__在調用MyClass(...)時調用對象的__init__,有效地向MyClass提供一個未初始化的類實例。 init與從MyClass中調用的參數。同樣,按照答案中的建議,調用cls(...)也是有意義的。謝謝。

回答

1
@classmethod 
def get_kv_object(cls, key): 
    value = kv_get(key) 
    return cls(key, value, add=False) 

__init__創建cls類的新實例!這是在創建對象後立即調用的方法。

2

想想如何你通常會創建一個新的數據庫對象,它會像下面這樣:

instance = DatabaseObject(key, value, add=False) 

嗯,你的類方法中(在這種情況下cls)的第一個參數是另一個名稱而已DatabaseObject,因此要創建實例,請執行以下操作:

instance = cls(key, value, add=False)