Я создаю класс, который наследует OrderedDict, в котором каждый ключ возвращает список. Я хочу перегрузить setitem, так что если ключ не существует, новые назначения сразу же помещают значение в список, иначе новое значение добавляется к списку. Далее, кажется, работает:Python OrderedDict __setitem__ overloading
from collections import OrderedDict
class ListDict(OrderedDict):
def __init__(self):
super(ListDict, self).__init__()
def __setitem__(self, key, value):
if key in self:
self[key].append(value)
else:
super(ListDict, self).__setitem__(key, [value])
thedict = ListDict()
thedict['a'] = 'first item'
thedict['b'] = 'another first item'
thedict['a'] = 'a second item?'
print thedict
который печатает:
$ python inheritex.py
ListDict([('a', ['first item', 'a second item?']), ('b', ['another first item'])])
Вместо добавления с оператором присваивания «=», я предпочел бы новые элементы добавляются с «+ =», или даже что-то вроде:
ListDict['key'] = ListDict['key'] + 'value'
Как можно перегружать это? Кроме того, возможно, что обезьяна-патч добавляет функцию add, это даже Pythonic/readable означает изменить поведение класса, или это приемлемо, потому что унаследованная функция (OrderedDict) не затронута?
FWIW,' если ключ в self' является _much_ лучше, чем 'если ключ в self.keys()' :-) – mgilson
@mgilson: Оооф вы правы. >. <Я все еще вижу код наследования с 'self' в нем и получаю woozy и disoriented ... – ultraturtle0