【发布时间】:2019-05-04 17:42:07
【问题描述】:
我正在尝试继承 dict 以修改其 update 方法。
我正在寻找的行为是添加公共键的值并保留唯一的。
示例:
g1 = MyDict({1: 1, 2: 2})
g2 = MyDict({1: 1, 3: 3})
g1.update(g2) # should result in g1 = {1: 2, 2: 2, 3: 3}
# ^ because it is 1 from g1 + 1 from g2
换句话说,就像我在做:
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)
它产生:
{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 方法时我做错了什么?
【问题讨论】:
-
您正在定义
__update__方法,但您正在调用update方法。同样__update__根本不修改字典,它只是返回一个新值(这里不做任何事情)。 -
@deceze 抱歉,复制粘贴错误。请再看看。
-
将
def __update__(self, d2):更改为def update(self, d2): -
update与__update__的问题仍然相同。它适用于__add__,因为+隐式调用__add__。但是update并没有隐式调用__update__,因为为什么会这样呢?此外,分配给self并没有多大作用;self只是方法中的一个局部变量。 -
@CarlosMermingas 仅此更改不起作用。
标签: python python-3.x class dictionary subclassing