Python 3.x 是否有覆盖散列的用例?
在Python3中,任何类都将有一个默认的Python 3.x 是否有覆盖散列的用例?,python-3.x,hash,magic-function,Python 3.x,Hash,Magic Function,在Python3中,任何类都将有一个默认的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我可以将它(显式或隐式)设置为None,以使类不可散列,这当然有一些用例 但是是否有理由覆盖\uuuuuuuuuuuuuuuuuuuuuuuuu 我找不到。是的!任何时候您重写\uuuuuuuueq\uuuuuuu,并且希望能够将对象用作集合或dict中的键。这在值类型或对象表示真实世界实体的情况下尤其常见 \uu
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我可以将它(显式或隐式)设置为None,以使类不可散列,这当然有一些用例
但是是否有理由覆盖\uuuuuuuuuuuuuuuuuuuuuuuuu
我找不到。是的!任何时候您重写\uuuuuuuueq\uuuuuuu
,并且希望能够将对象用作集合或dict中的键。这在值类型或对象表示真实世界实体的情况下尤其常见
\uuuuuuuuuuuuuuuuuuuu
根本不哈希成员变量。对于未定义\uuuuuu散列\uuuuuu
或\uuuuu eq\uuuuu
的对象,它会根据其内部指针返回一些值。如果定义了\uuuu eq\uuuu
,则调用该方法将导致TypeError.work
考虑一下这个简单的例子,默认的\uuuuuuuueq\uuuuuuuu
和\uuuuuuuuuuuuuuuuuu散列\uuuuuuuu
行为不是很好:
import getpass
class User:
def __init__(self, name):
self.name = name
def currentUser():
return User(getpass.getuser())
me = currentUser()
passwords = {}
passwords[me] = "sw0rdfish";
这有一些奇怪的行为:me==currentUser()
为false,而passwords[currentUser()]
抛出一个KeyError。为了解决这个问题,我们定义了一个
def __eq__(self, other):
return self.name == other.name
def __hash__(self):
return hash(self.name)
现在,me==currentUser()
是真的,但是尝试分配密码会抛出一个TypeError:unhabable类型:“User”
。现在我们已经到了要覆盖\uuuuu散列\uuuuu
的地步:
def __eq__(self, other):
return self.name == other.name
def __hash__(self):
return hash(self.name)
现在,它的行为就像您使用它作为键时所期望的任何其他此类对象的行为一样。我想到的一件事是通过预计算散列值并使用\uuuuuhash\uuuuu
检索这些预计算值来加快速度。如果您的类基于通常不可损坏的类型(可能是列表?),但是您知道类实例可以以某种独特的方式定义,定义您自己的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
可以让您表达。但是对于那些需要比较很长时间的数据的类?那会是什么样的数据?巨弦?@Stephernauch:没想过那个。@steffen是的,巨弦是我的第一个目标。或者,如果您的数据是从网络/数据库动态访问的。或者,如果您的数据处于某种不可破坏的数据结构中(例如,set()
,但frozenset()
是可散列的)。。。