2013-03-14 49 views
3

我想創建一個類,它將數據存儲在本地緩衝區中,並充當數據庫的接口。我有下面的代碼:__getitem__,__setitem__多個鍵Python

class Table(object):  
    def __init__(self, tableName, **columnDict): 
     self.tableName  = tableName 
     self.columns  = {} 
     self.types   = {} 
     self.columns['id'] = [] 
     self.types['id'] = 'INT PRIMARY KEY NOT NULL' 
     for name in columnDict: 
      self.columns[name] = [] 
      self.types[name] = columnDict[name] 

    def updateBufferRow(self, index, updateDict): 
     for key in updateDict: 
      self.columns[key][index] = updateDict[key] 

    def getBufferRow(self, index): 
     row = {} 
     for key in self.columns: 
      row[key] = self.columns[key][index] 
     return row 

    def __getitem__(self, key, **args): 
     """ Allows using self[key] method """ 
     return self.getBufferRow(key) 

    def __setitem__(self, key, value, **args): 
     """ Allows using self[key] = value method """ 
     self.updateBufferRow(key, value) 

這裏是我初始化表:

testTable = Table('BestTable', test = 'TestType', test2='INT') 

它將按預期工作的唯一的事,如果我嘗試:

testTable[0]['test'] = "LALALA" 

它什麼都不做另一方面,這更新而不是覆蓋表格:

testTable[0] = {"test": "LALALA"} 

我知道我不得不重寫updateBufferRow()和getBufferRow()方法,但我不太確定的唯一方法是如何使用__getitem__和__setitem__方法獲得多個鍵 任何幫助/提示將不勝感激。感謝你們!

回答

3

您的__getitem__返回的dict與您的列沒有任何關係。你需要返回的東西,也許看起來像一個dict但地圖__setattr__回調到您的表列:

class Row(dict): 
    def __init__(self, table, index, *args, **kw): 
     self._table, self._index = table, index 
     super(Row, self).__init__(*args, **kw) 

    def __setitem__(self, key, value): 
     super(Row, self).__setitem__(key, value) 
     self._table.columns[key][self._index] = value 

然後返回,而不是常規的dict

def getBufferRow(self, index): 
    row = {} 
    for key in self.columns: 
     row[key] = self.columns[key][index] 
    return Row(self, index, row) 
+0

感謝馬亭,我我會嘗試一下 – Barmaley 2013-03-14 19:20:53

+0

@Barmaley:我現在測試了代碼,並在那裏調用了__init__調用。 – 2013-03-14 19:27:56

+0

我實際上改變了我的結構,它簡化了一切,現在它可以工作。 – Barmaley 2013-03-14 20:13:07

相關問題