假设你用了
frozendict
this one
:
class frozendict(collections.Mapping):
"""
An immutable wrapper around dictionaries that implements the complete :py:class:`collections.Mapping`
interface. It can be used as a drop-in replacement for dictionaries where immutability is desired.
"""
dict_cls = dict
def __init__(self, *args, **kwargs):
self._dict = self.dict_cls(*args, **kwargs)
self._hash = None
def __getitem__(self, key):
return self._dict[key]
def __contains__(self, key):
return key in self._dict
def copy(self, **add_or_replace):
return self.__class__(self, **add_or_replace)
def __iter__(self):
return iter(self._dict)
def __len__(self):
return len(self._dict)
def __repr__(self):
return '<%s %r>' % (self.__class__.__name__, self._dict)
def __hash__(self):
if self._hash is None:
h = 0
for key, value in self._dict.items():
h ^= hash((key, value))
self._hash = h
return self._hash
如果你想让它变异,你可以直接进入变异
self._dict
:
d = frozendict({'a': 1, 'b': 2})
d['a'] = 3 # This fails
mutable_dict = d._dict
mutable_dict['a'] = 3 # This works
print(d['a'])
接触到类的受保护成员有点恶心,但我想说没关系,因为你要做的是有点恶心。如果你想要一个可变字典(只是一个
dict
像上面这样的实现。可变和不变的混合体是没有意义的。全部
冻僵
它没有实现突变邓德方法(
__setitem__
,
__delitem__
等等)。引擎盖下a
冻僵
由一个正则的,可变的
.
在我看来,上述方法比你所链接的方法优越。可组合性
冻僵
_dict
属性)比继承(子类化)更容易推理
)在很多情况下。