子类化Python的dict,重写__setitem__不保留新值

2 投票
1 回答
1121 浏览
提问于 2025-04-15 15:33

我在创建一个字典的子类时遇到了一个问题,主要是在setitem这个方法上。有一个赋值操作可以正常工作,但另一个赋值操作却不行。我把问题简化成了下面这个基本问题:

class CustomDict(dict):
 def __setitem__(self, key, value):
  super(CustomDict, self).__setitem__(key, value)

测试1失败:

data = {"message":"foo"}
CustomDict(data)["message"] = "bar"
print CustomDict(data) # Expected "{'message': 'bar'}". Actual is "{'message': 'foo'}".
print data # Expected "{'message': 'bar'}". Actual is "{'message': 'foo'}".

测试2成功:

data = CustomDict({"message":"foo"})
data["message"] = "bar"
print CustomDict(data) # Expected "{'message': 'bar'}". Actual matches expected.
print data # Expected "{'message': 'bar'}". Actual matches expected.

我在网上查了一下,但不太确定子类的构造函数是否会复制字典,这样操作就会在字典的不同实例上进行。有没有什么建议?

1 个回答

10

你在每一行都在创建新的 CustomDict 实例。CustomDict(data) 这个操作会生成一个新的实例,并且会复制 data 的内容。

试试这个:

cd = CustomData({"message":"foo"})
cd["message"] = "bar"
print cd # prints "{'message': 'bar'}".

撰写回答