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