The collections.abc http://docs.python.org/3.3/library/collections.abc.html#collections-abstract-base-classes模块定义了类似的接口Mapping
, Sequence
, 等等。
通过从该模块中的抽象基类继承,您可以获得某些方法的默认实现。所以要被认为是Mapping
,你的类定义应该是这样的:
class MyMapping(collections.abc.Mapping):
def __getitem__(self, key):
pass
def __iter__(self):
pass
def __len__(self):
pass
继承自Mapping
将为您提供大部分的“免费”实现dict
的有用方法:
__contains__
keys
items
values
get
__eq__
__ne__
如果这些默认方法实现对于您的自定义数据结构效率低下,您始终可以使用自己的版本覆盖它们。
被视为MutableMapping
,你的类的接口应该是这样的:
class MyMutableMapping(collections.abc.MutableMapping):
def __getitem__(self, key):
pass
def __setitem__(self, key, item):
pass
def __delitem__(self, key):
pass
def __iter__(self):
pass
def __len__(self):
pass
继承自MutableMapping
为您提供所有的“自由”定义Mapping
的方法,加上:
pop
popitem
clear
update
setdefault
如果您从头开始“推出自己的”并且不想使用抽象基类,那么您可能应该尝试定义all上述方法中,如果你希望你的类可以严格用 Liskov 替代dict
.