Как верно подметил
fenrir , наследоваться надо от
UserDict.
Чуть поменял код, можете посмотреть что вышло. Была еще проблема в том, что при создании объекта вызывается метод
__setitem__, для этого добавил флаг
_initialization_finished
from collections import UserDict
class MyDict(UserDict):
def __init__(self, **kwargs):
self._initialization_finished = False
print('Создан объект')
super().__init__(**kwargs)
self._initialization_finished = True
def __setitem__(self, item, value):
if self._initialization_finished:
print(f"Вы поменяли значение {item} на {value}!")
if isinstance(value, dict):
value = MyDict(**value)
super().__setitem__(item, value)
def __getitem__(self, item):
print(f"Пытаемся получить значение {item}")
return super().__getitem__(item)
d = MyDict(x='123', y=15, z={'a': 4})
# Создан объект
# Создан объект
d['x'] = '456'
# Вы поменяли значение x на 456!
e = d['y']
# Пытаемся получить значение y
Два сообщения подряд "Создан объект" из-за того, что сначала создается основной кастомный словарь, потом создается словарь под ключом
z, который тоже вызывает сообщение