2009-10-31 2 views
2

Я подклассифицировал dict, но столкнулся с проблемой с setitem, где одно задание работает, но другого назначения нет. Я варил вниз к следующей основной задачи:Подкласс python's dict, переопределение __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'}". 

Test 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. 

Я посмотрел в Интернете, но не может сказать, является ли конструктор подкласса копирует словарь, поэтому операции выполняются на другом экземпляре словаря. Любой совет?

ответ

10

Вы создаете новые экземпляры CustomDict для каждой строки. CustomDict(data) представляет новый экземпляр, который копирует data.

Попробуйте это:

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

Спасибо, Нед. Это глубокая копия и любые предложения о том, где искать код python, чтобы найти __init__ для dict? –

+0

Это не глубокая копия. Код для dict довольно активно, 2500 строк C. Если вы хотите его прочитать, он находится в Objcets/dictobject.c в исходном дистрибутиве Python. –

+0

Хорошо, спасибо за информацию –