Почему self .__ add __ (a) и self + a не возвращают одинаковые значения в словарях? - PullRequest
0 голосов
/ 21 ноября 2018

Я прохожу курс Python, и упражнение состоит в том, чтобы создать класс, в котором вы можете добавить словарь к другому, набрав: dict1 = dict1 + dict2

Так что это делается путем создания метода __add__в классе, потому что dict1 + dict2 - это то же самое, что и dict1.__add__(dict2), верно?За исключением того, что если я наберу эти 2 команды, они не возвращают одно и то же значение.Это фрагмент моего кода:

class zDict(dict):
...
     def __add__(self, otherDict):
         otherDict = [(k,v) for k,v in otherDict.items()]
         print("passed through zDict.__add__") #just to make sure           
         for key, value in otherDict:
             self[key]=value
...

Так что теперь, если мы запустим это с 2 объектами zDict, dict1 = {'a':1,'b':2,'c':3} и dict2 = {'d':4,'e':5} для примеров, вот результаты (Python 3.6.6):

>>> dict1.__add__(dict2)
passed through zDict.__add__
>>> dict1
>>> {'a':1,'b':2,'c':3,'d':4,'e':5}
>>> type(dict1)
>>> <class '__main__.zDict'>

RESTART

>>> dict1 += dict2
passed through zDict.__add__
>>> dict1

>>> type(dict1)
>>> <class 'NoneType'>

Так что я там не понимаю.Я набрал одно и то же, но получил разные результаты.dict1 = dict1 + dict2 - это то же самое, что и dict1 += dict2, что совпадает с dict1 = dict1.__add__(dict2), верно?И я убедился, что они проходят через тот же метод с печатью.Он не может быть получен из dict class, потому что у него нет метода __add__.Может быть, он проходит через метод из родительского класса, такого как объект, который меняет тип на NoneType?Как я могу это проверить и предотвратить?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

+= реализовано с использованием метода __iadd__, см. этот ответ

0 голосов
/ 21 ноября 2018

zDict.__add__() вернет None (т. Е. Вы меняете себя на месте) dict1 += dict2 такое же, как dict1 = dict1.__add__(dict2)

, также почему бы не использовать dict.update()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...