Форум сайта python.su
Всем привет!
Помогите пожалуйста грамотно написать класс D или ссылку с примерами расширения базовых классов.
class D(dict):
???
a = D({1: 3, 2: ‘x’})
b = D({0: 3, 1: 2, 2: ‘y’})
a += b или a.update(b)
print a
{0:3, 1:5, 2:'xy'}
Офлайн
>>> class D(dict):
... def update(self, d):
... for k in d.keys():
... if k in self:
... self[k] += d[k]
... else:
... self[k] = d[k]
...
>>> a = D({1: 3, 2: 'x'})
>>> b = D({0: 3, 1: 2, 2: 'y'})
>>> a.update(b)
>>> print a
{0: 3, 1: 5, 2: 'xy'}
>>>
Отредактировано (Ноя. 29, 2011 11:25:45)
Офлайн
Спасибо!!!!
Думал всё будет гораздо сложнее…
Офлайн
Можно еще чуточку красивше сделать:
class D(dict):
def __iadd__(self, d):
for k in d.keys():
if k in self:
self[k] += d[k]
else:
self[k] = d[k]
return self
a = D({1: 3, 2: 'x'})
b = D({0: 3, 1: 2, 2: 'y'})
a += b
print a
Офлайн
интересно, не знал
Офлайн
На самом деле правильнее определить не += (__iadd__), а просто + (__add__), тогда += разрешится через + и =. Явно определять __iadd__ имеет смысл только если логика + и += отличается. Если же определить только __iadd__ (как это идеологически неправильно сделал я), то и работать будет только +=, но не +, что является нарушением великого принципа наименьшего удивления.
Т.е., идеальный код :) будет таким:
class D(dict):
def __add__(self, d):
res = D(self)
for k in d.keys():
if k in res:
res[k] += d[k]
else:
res[k] = d[k]
return res
a = D({1: 3, 2: 'x'})
b = D({0: 3, 1: 2, 2: 'y'})
a += b
print a
Отредактировано (Дек. 2, 2011 15:32:11)
Офлайн