我想subclass
dict
在Python这样子类的所有词典是不可改变的。
我不明白怎么做__hash__
影响不变性,因为在我的理解,它只是意味着平等或对象的非平等 !
因此,可以__hash__
被用来实现不变性? 怎么样 ?
更新 :
目标是,从API常见的反应可作为一个字典,其具有作为一个全局变量被共享。 因此,需要保持完整不管是什么?
我想subclass
dict
在Python这样子类的所有词典是不可改变的。
我不明白怎么做__hash__
影响不变性,因为在我的理解,它只是意味着平等或对象的非平等 !
因此,可以__hash__
被用来实现不变性? 怎么样 ?
更新 :
目标是,从API常见的反应可作为一个字典,其具有作为一个全局变量被共享。 因此,需要保持完整不管是什么?
我发现了一个官方的参考:
class imdict(dict):
def __hash__(self):
return id(self)
def _immutable(self, *args, **kws):
raise TypeError('object is immutable')
__setitem__ = _immutable
__delitem__ = _immutable
clear = _immutable
update = _immutable
setdefault = _immutable
pop = _immutable
popitem = _immutable
署名: http://www.python.org/dev/peps/pep-0351/
因此,可以
__hash__
被用来实现不变性?
不,不能。 该目的可以由可变(或不)不管其是什么__hash__
方法一样。
不可改变的对象之间的关系__hash__
是,由于一个不可变的对象不能被改变,由返回的值__hash__
保持恒定后施工。 对于可变对象,这可能会或可能不是这种情况(推荐的做法是这样的对象简单地失败散列)。
如需进一步讨论,请参见发行13707:明确hash()
constency时期 。
关于hashability和可变性之间的关系:
为了有用,散列实现需要满足以下特性:
是比较使用相等的两个对象的散列值==
必须相等。
哈希值可能不随时间而改变。
这两个属性意味着比较实例时,哈希的类不能采取可变的特性考虑,并通过对位的是里面做类采取可变属性考虑在内时,比较实例不是可哈希。 一成不变的类可以制成可哈希不作比较没有任何影响。
所有内置可变类型的不是可哈希,所有的不可变的内置类型是可哈希。 这主要是上述意见的结果。
用户定义的类默认基于对象标识定义进行比较,并使用id()
为哈希。 他们是可变的,但比较情况下,当可变数据没有考虑到,这样他们就可以进行哈希的。
使类可哈希不让它在一些神奇的方式不变。 相反,做一个字典可哈希以合理的方式,同时保持原有的比较操作,您首先需要使它不变。
编辑 :关于你提到的更新:
有几种方法,以提供全球不可改变字典相当于:
使用collections.namedtuple()
的实例来代替。
使用具有只读属性的用户定义的类。
我通常像这样的东西去:
_my_global_dict = {"a": 42, "b": 7} def request_value(key): return _my_global_dict[key]
通过领先的下划线,你清楚地表明_my_global_dict
是一个实现细节不被应用程序代码被感动。 请注意,此代码将仍然允许,如果他们碰巧是可变对象修改字典中的值 。 你可以解决通过返回这个问题copy.copy()
S或copy.deepcopy()
如有必要,S中的值。