我正在使用python-spidermonkey,它在内部使用PyMapping_Check来识别被用作全局的对象(在rt.new_context(全局)中)是否实现了映射协议。 (这基本上是传递给python-spidermonkey的字典,因此javascript对python变量的访问权限有限。)
我没有找到Python中的映射协议的官方定义,所以我一直在使用反复试验来确定其中的内容。有官方参考吗?
答案 0 :(得分:14)
collections.abc
模块为Mapping
,Sequence
等内容定义接口。
通过继承该模块中的抽象基类,您可以获得某些方法的默认实现。因此,要将其视为Mapping
,您的类定义应如下所示:
class MyMapping(collections.abc.Mapping):
def __getitem__(self, item)
def __iter__(self)
def __len__(self)
继承Mapping
会让您“免费”实施大多数dict
的有用方法:
__contains__
keys
items
values
get
__eq__
__ne__
如果这些默认方法实现对您的自定义数据结构效率低下,您始终可以使用自己的版本覆盖它们。
要被视为MutableMapping
,您班级的界面应如下所示:
class MyMutableMapping(collections.abc.MutableMapping):
def __getitem__(self, item)
def __setitem__(self, item)
def __delitem__(self, item)
def __iter__(self)
def __len__(self)
从MutableMapping
继承可以获得所有Mapping
方法的'免费'定义,以及:
pop
popitem
clear
update
setdefault
如果您从头开始“自己滚动”并且不想使用抽象基类,那么您应该尝试定义所有上述方法,如果您想要您的类严格来说是Liskov可替代dict
。