Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 29, 2011 10:27:58

yield
От:
Зарегистрирован: 2011-05-10
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

расширение dict

Всем привет!
Помогите пожалуйста грамотно написать класс 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'}



Офлайн

#2 Ноя. 29, 2011 11:24:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9729
Репутация: +  843  -
Профиль   Отправить e-mail  

расширение dict

>>> 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)

Офлайн

#3 Ноя. 29, 2011 11:26:54

yield
От:
Зарегистрирован: 2011-05-10
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

расширение dict

Спасибо!!!!
Думал всё будет гораздо сложнее…



Офлайн

#4 Дек. 1, 2011 14:01:43

kaa
От:
Зарегистрирован: 2009-01-11
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

расширение dict

Можно еще чуточку красивше сделать:

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



Офлайн

#5 Дек. 2, 2011 12:53:24

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9729
Репутация: +  843  -
Профиль   Отправить e-mail  

расширение dict

интересно, не знал



Офлайн

#6 Дек. 2, 2011 15:25:57

kaa
От:
Зарегистрирован: 2009-01-11
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

расширение dict

На самом деле правильнее определить не += (__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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version