如何自定义容器类型,那么我们就需要考虑类似于标准容器类型是如何实现的?我们可通过继承标准字典类型的基类来实现重载。官方文档有描述(见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)))