Python语言特性:如何自定义dict

如何自定义容器类型,那么我们就需要考虑类似于标准容器类型是如何实现的?我们可通过继承标准字典类型的基类来实现重载。官方文档有描述(见https://docs.python.org/3/reference/datamodel.html?emulating-container-types#object.__delitem__), 比如字典类型就是继承了MutableMapping基类,我们自定义字典类型则也需要继承该类,并实现该类的抽象方法。

通过阅读文档发现,我们只需要实现__getitem__、_setitem__、_dekitem__、keys四个方法即可,keys方法采用__iter__和__len__方法实现,这样我们最终就需要重载5个抽象方法。实现版本如下:

from collections.abc import MutableMapping


class attrdict(MutableMapping):

    def __init__(self, *args, **kwargs):
        self._storage = dict(*args, **kwargs)

    def __getitem__(self, key):
        return self._storage[key]

    def __setitem__(self, key, value):
        self._storage[key] = value

    def __delitem__(self, key):
        del self._storage[key]

    def __iter__(self):
        return iter(self._storage)

    def __len__(self):
        return len(self._storage)

if __name__ == "__main__":
    d = attrdict(x=1, name="hell")
    for key,value in d.items():
        print("d key:%s, value:%s" % (key, value))

    for key in d.keys():
        print("d key:%s, value:%s" % (key, d.get(key)))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值