self .__ add __(a)和self + a在字典中返回的值为何不相同?

时间:2018-11-21 10:07:24

标签: python dictionary

我正在上一门Python课程,练习的目的是创建一个类,您可以在其中输入以下内容来添加字典:dict1 = dict1 + dict2

因此,这是通过在类中创建__add__方法来完成的,因为dict1 + dict2与键入dict1.__add__(dict2)相同,对吗?除非我键入这两个命令,否则它们不会返回相同的值。这是我的代码的摘录:

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 :(得分:0)

zDict.__add__()将返回None(即您将自己更改为原位) dict1 += dict2dict1 = dict1.__add__(dict2)

还为什么不使用dict.update()

答案 1 :(得分:0)

+=使用__iadd__方法实现,请参见this answer