Переопределите метод __setitem__
желаемым поведением, вызовите dict.__setitem__(self, key, value
), чтобы изменить базовый словарь без прохождения базовой логики.
class ImmutableDict(dict):
def __setitem__(self, key, value):
if key not in self:
raise KeyError("Immutable dict")
dict.__setitem__(self, key, value)
d = ImmutableDict(foo=1, bar=2)
d['foo'] = 3
print(d)
d['baz'] = 4 # Raises error
Вам также нужно переопределить dict.update()
и setdefault()
, чтобы избежать добавления ключей. И возможно dict.__delitem__()
, dict.clear()
, dict.pop()
и dict.popitem()
, чтобы избежать удаления ключей.