Python 覆盖字典';更新';方法

Python 覆盖字典';更新';方法,python,python-3.x,class,dictionary,subclassing,Python,Python 3.x,Class,Dictionary,Subclassing,我正在尝试子类化dict,以修改其update方法 我正在寻找的行为是添加公共键的值并保留唯一键 例子: 换句话说,就好像我在做: from collections import Counter g1 = dict(Counter(g1) + Counter(g2)) 对于此任务,我编写了以下内容: class MyDict(dict): def __update__(self, d2): keys = set(self).union(d2) sel

我正在尝试子类化
dict
,以修改其
update
方法

我正在寻找的行为是添加公共键的值并保留唯一键

例子:
换句话说,就好像我在做:

from collections import Counter
g1 =  dict(Counter(g1) + Counter(g2))
对于此任务,我编写了以下内容:

class MyDict(dict):
    def __update__(self, d2):
        keys = set(self).union(d2)
        self = {k: self.get(k, 0) + d2.get(k, 0) for k in keys}
        return
但是,在这样做时:

g1 = MyDict({1: 1, 2: 2})
g2 = MyDict({1: 1, 3: 3})
g1.update(g2)
g1 = MyDict({1: 1, 2: 2})
g2 = MyDict({1: 1, 3: 3})
g1.update(g2)
它产生:

{1: 1, 2: 2, 3: 3}
但是,如果我这样做:

class MyDict(dict):
    def __add__(self, d2):
        keys = set(self).union(d2)
        return {k: self.get(k, 0) + d2.get(k, 0) for k in keys}
然后

g1 = g1 + g2
实现了所需的行为


覆盖
update
方法时我做错了什么?

我找到了以下方法:

class MyDict(dict):
    def update(self, d2):
        for k in set(self).union(d2):
            self[k] = self.get(k, 0) + d2.get(k, 0)
        return
事实上,在这样做时:

g1 = MyDict({1: 1, 2: 2})
g2 = MyDict({1: 1, 3: 3})
g1.update(g2)
g1 = MyDict({1: 1, 2: 2})
g2 = MyDict({1: 1, 3: 3})
g1.update(g2)
结果:

print(g1)  # -> {1: 2, 2: 2, 3: 3}

如果有更好的办法,请告诉我


谢谢你的评论

您正在定义
\uuu update\uu
方法,但您正在调用
update
方法。另外,
\uuuuuuu update\uuuuuuu
根本不修改dict,它只是返回一个新值(在这里没有任何作用)。@deceze抱歉,复制粘贴错误。请再看一看。将
def\uu更新(self,d2):
更改为
def更新(self,d2):
更新问题相比仍然是相同的
更新问题。它与
\uuuu add\uuu
一起工作,因为
+
隐式调用
\uuuuu add\uu
。但是
update
并不隐式调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,因为它为什么会这样做?此外,分配给
自我
也没什么作用
self
只是方法中的一个局部变量。@carlosmerming因为仅此更改不起作用。