子类collections.abc.MutableMapping-更新方法

时间:2019-06-27 13:55:20

标签: python python-3.x

我尝试了解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()吗?怎么做?

1 个答案:

答案 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