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因为仅此更改不起作用。