子类化Python的dict,重写__setitem__不保留新值
我在创建一个字典的子类时遇到了一个问题,主要是在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'}".