__getitem__, __setitem__ 多个键
Posted
技术标签:
【中文标题】__getitem__, __setitem__ 多个键【英文标题】:__getitem__, __setitem__ multiple keys 【发布时间】:2013-03-03 07:33:34 【问题描述】:我正在尝试创建一个将数据存储在本地缓冲区中并充当数据库接口的类。我有以下代码:
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】:您的__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)
【讨论】:
这是我所做的:从 [],[],[] 结构移动到 [,,] @Barmaley: 是的,所以不是使用每列列表的映射,而是切换到使用行字典列表。如果这适用于您的应用程序,这是一个更好的主意。这种情况下不需要代理。 如果有多个键,它会起作用吗:cfg['key_1']['key_2'] = 3
@alper:并非没有额外的工作。第一个键 (cfg['key_1']
) 是 __getitem__
操作,__setitem__
将应用于该操作的结果。因此,如果 cfg
是您返回的自定义对象,您还需要控制 __getitem__
返回的内容。以上是关于__getitem__, __setitem__ 多个键的主要内容,如果未能解决你的问题,请参考以下文章
__getitem__ __setitem__ __delitem__ 使用
python学习之__getitem__,__setitem__,__delitem__
python - __setitem__/__getitem__/__delitem__类的内置方法
__getitem__\__setitem__\__delitem__