__getitem __,__ setitem__多个键 [英] __getitem__, __setitem__ multiple keys
问题描述
我正在尝试创建一个将数据存储在本地缓冲区中以及充当数据库接口的类.我有以下代码:
I am trying to create a class that stores data in a local buffer as well as acts as an interface to a database. I've got following code:
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)
这是我初始化表格的方式:
Here is how I initialize the table:
testTable = Table('BestTable', test = 'TestType', test2='INT')
如果我尝试的话,它只能按预期工作:
It works as expected the only thing if I try:
testTable[0]['test'] = "LALALA"
它什么都不做,另一方面,它会更新而不是覆盖表:
It does nothing, on the other hand this updates rather than overwrites the table:
testTable[0] = {"test": "LALALA"}
我知道我必须重写updateBufferRow()和getBufferRow()方法,我不确定的唯一一件事就是如何使用_ getitem _和_ setitem _方法.
I know I have to rewrite updateBufferRow() and getBufferRow() methods, the only thing I am not quite sure is how to get multiple keys using _getitem_ and _setitem_ methods.
推荐答案
您的 __ getitem __
返回的 dict
与您的列不再相关.您需要返回看起来像 dict
的东西,但将 __ setattr __
调用映射回表列:
The dict
returned by your __getitem__
has no relation any more with your columns. You'll need to return something that perhaps looks like a dict
but maps __setattr__
calls back to your table columns:
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
:
then return that instead of a regular dict
:
def getBufferRow(self, index):
row = {}
for key in self.columns:
row[key] = self.columns[key][index]
return Row(self, index, row)
这篇关于__getitem __,__ setitem__多个键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!