Объекты классов ListAdder и DictAdder могут участвовать в операциях сложения через класс Adder. При этом механизм сложения у каждого подкласса реализован отдельно.
class Adder:
def add(self, y):
print('not implemented!')
def __init__(self, start=[]): # вызывается также из классов ListAdder и DictAdder
self.data = start
def __add__(self, other): # вызывается в выражениях < объект + other >
return self.add(other) # self передается в первом аргументе
class ListAdder(Adder):
def add(self, y): # сложение двух списков
return self.data + y
class DictAdder(Adder):
def add(self, y): # сложение двух словарей
new = {}
for key in self.data: # извлекается каждый ключ из self.data
new[key] = self.data[key] # в new добавляется пара < ключ:значение >
for key in y:
new[key] = y[key]
return new
Проверка работы скрипта:
>>> a = ListAdder([2,3])
>>> a.data
[2, 3]
>>> a + [5]
[2, 3, 5]
>>> a
<__main__.ListAdder object at 0x00000000034E27F0>
>>> a.data
[2, 3]
>>> b = DictAdder({'p':10, 'q':20, 'r':0})
>>> b + {'t':30}
{'q': 20, 'p': 10, 'r': 0, 't': 30}
>>> b + {'r':30}
{'q': 20, 'p': 10, 'r': 30}