Опираясь на ответ, данный в здесь , просто сделайте следующее:
class MyDict(dict):
def __setitem__(self, item, value):
print("You are changing the value of {} to {}!!".format(item, value))
super(MyDict, self).__setitem__(item, value)
, а затем:
my_dict = MyDict({'a': MyDict({'b': 1})})
my_dict['a']['b'] = 2
Вы меняетезначение от b до 2 !!
my_dict['a'] = 5
Вы изменяете значение a на 5 !!
Если вы хотите избежать ручных вызововMyDict на каждом уровне вложенности, один из способов сделать это - полностью перегрузить класс dict .Например:
class MyDict(dict):
def __init__(self,initialDict):
for k,v in initialDict.items():
if isinstance(v,dict):
initialDict[k] = MyDict(v)
super().__init__(initialDict)
def __setitem__(self, item, value):
if isinstance(value,dict):
_value = MyDict(value)
else:
_value = value
print("You are changing the value of {} to {}!!".format(item, _value))
super().__setitem__(item, _value)
Затем вы можете сделать следующее:
# Simple initialization using a normal dict synthax
my_dict = MyDict({'a': {'b': 1}})
# update example
my_dict['c'] = {'d':{'e':4}}
Вы меняете значение c на {'d': {'e': 4}} !!
my_dict['a']['b'] = 2
my_dict['c']['d']['e'] = 6
Вы изменяете значение b на 2 !!
Вы изменяете значение e на 6 !!