我尝试了解collections.abc.MutableMapping
的子类化。我创建了自己的dict
版本,其中显示了一些信息:
from collections.abc import MutableMapping
class MutableMappingTest(MutableMapping):
def __init__(self, *args, **kwargs):
print('__init__', args, kwargs)
self.my_store = dict()
self.update(dict(*args, **kwargs))
def __getitem__(self, key):
print('__getitem__:', key)
return self.my_store[key]
def __setitem__(self, key, value):
print('__setitem__:', key, value)
self.my_store[key] = value
def __delitem__(self, key):
print('__delitem__:', key)
del self.my_store[key]
def __iter__(self):
print('__iter__')
return iter(self.my_store)
def __len__(self):
print('__len__')
return len(self.my_store)
我不明白的是:当我通过分配给嵌套属性进行更新时,__setitem__
不会被调用,而只是被调用__getitem__
:
>>> t = MutableMappingTest(test={"deep": "foo"})
__init__ () {'test': {'deep': 'foo'}}
__setitem__: test {'deep': 'foo'}
>>> t['test']['deep'] = 'bar'
__getitem__: test
我还如何迷上更新嵌套属性的方法。我必须重写update()吗?怎么做?
答案 0 :(得分:0)
因为您没有在t
中设置项目。而是从t
获取常规词典,然后在该词典中设置一个项目。
如果希望子词典的行为类似于MutableMappingTest
对象,则必须使它们成为MutableMappingTest
对象。
>>> t = MutableMappingTest(test=MutableMappingTest(deep="foo"))
__init__ () {'deep': 'foo'}
__setitem__: deep foo
__init__ () {'test': <__main__.MutableMappingTest object at 0x000001EA3C1DDB00>}
__setitem__: test <__main__.MutableMappingTest object at 0x000001EA3C1DDB00>
>>> t['test']['deep'] = 'bar'
__getitem__: test
__setitem__: deep bar