实现子类很容易:
class WriteOnceDict(dict):
def __setitem__(self, key, value):
if key in self:
raise KeyError('{} has already been set'.format(key))
super().__setitem__(key, value)
您还可以提供自定义update()
方法,并取决于你想要的严格程度,__delitem__()
, pop()
, popitem()
, and clear()
可能也需要重写。
对于超严格的版本来说,更容易混进去collections.abc.MutableMapping() http://docs.python.org/library/collections.abc.html#collections.abc.MutableMapping因为它为您实现了大多数方法__getitem__
, __setitem__
and __delitem__
calls:
from collections.abc import MutableMapping
class StrictWriteOnceDict(MutableMapping, dict):
# dict implementations to override the MutableMapping versions
__getitem__ = dict.__getitem__
__iter__ = dict.__iter__
__len__ = dict.__len__
def __delitem__(self, key):
raise KeyError('Read-only dictionary')
def __setitem__(self, key, value):
if key in self:
raise KeyError('{} has already been set'.format(key))
dict.__setitem__(self, key, value)
允许删除就像替换一样简单__delitem__
方法与__delitem__ = dict.__delitem__
.