你真的不想子类化dict
因为你无法真正重用它的任何功能。相反,子类化抽象基类collections.Mapping http://docs.python.org/library/collections.html?highlight=collections#abcs-abstract-base-classes (or MutableMapping
如果您还希望能够在创建后修改实例),则为此目的实现不可或缺的特殊方法,您将获得其他dict
- 类似于 ABC 的“免费”方法。
您需要编码的方法是__getitem__
(and __setitem__
and __delitem__
如果你想要可变性),__len__
, __iter__
, and __contains__
.
The bisect http://docs.python.org/library/bisect.html?highlight=bisect#module-bisect标准库的模块为您提供了在排序列表之上有效实现这些功能所需的一切。例如...:
import collections
import bisect
class MyDict(collections.Mapping):
def __init__(self, contents):
"contents must be a sequence of key/value pairs"
self._list = sorted(contents)
def __iter__(self):
return (k for (k, _) in self._list)
def __contains__(self, k):
i = bisect.bisect_left(self._list, (k, None))
return i < len(self._list) and self._list[i][0] == k
def __len__(self):
return len(self._list)
def __getitem__(self, k):
i = bisect.bisect_left(self._list, (k, None))
if i >= len(self._list): raise KeyError(k)
return self._list[i][1]
你可能会想摆弄__getitem__
取决于您想要针对各种极端情况返回什么(或者是否想要筹集),例如“k
大于所有键self
".