__getitem__,__setitem__ 多个键
我正在尝试创建一个类,这个类不仅可以在本地存储数据,还能作为数据库的接口。我写了以下代码:
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_ 方法来获取多个键。
1 个回答
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)