Будьте осторожны при создании подкласса dict
. Если вы просто переопределите __setitem__
, то другие dict
методы, такие как update
, не будут вызывать ваш __setitem__
.
class MyDict(dict):
def __setitem__(self, key, value):
dict.__setitem__(self, key, 2 * value)
d = MyDict()
d['first'] = 3
print(d['first'])
# 6
d.update({'first':4})
print(d['first'])
# 4 # <--- __setitem__ was not called.
Для создания объекта, похожего на dict, вам необходимо либо создать подкласс dict
и переопределить все методы (пример такого подхода см. OrderedDict ), либо подкласс collections.MutableMapping
и переопределить небольшое подмножество этих методов (из которых получены все остальные методы).
import collections
class MyDict2(collections.MutableMapping,dict):
def __getitem__(self, key):
return dict.__getitem__(self, key)
def __setitem__(self, key, value):
dict.__setitem__(self, key, 2 * value)
def __delitem__(self, key):
dict.__delitem__(self, key)
def __iter__(self):
return dict.__iter__(self)
def __len__(self):
return dict.__len__(self)
def __contains__(self, x):
return dict.__contains__(self, x)
d = MyDict2()
d['first'] = 3
print(d['first'])
# 6
d.update({'first':4})
print(d['first'])
# 8