【问题标题】:__getitem__, __setitem__ multiple keys__getitem__, __setitem__ 多个键
【发布时间】: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_ 方法。

【问题讨论】:

    标签: python class magic-methods datamodel


    【解决方案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__ 返回的内容。
    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 2023-03-17
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多