在python3中,我有一个类。如下所示:
class Foo:
def __init__(self):
self.x = 3
def fcn(self, val):
self.x += val
然后我实例化该类的对象,如下所示:
new_obj = Foo()
new_obj2 = Foo()
现在,当我对这些对象进行哈希处理时,会得到不同的哈希值。我需要它们返回相同的哈希值,因为它们是相同的对象(理论上)。
你知道我该怎么做吗?
答案 0 :(得分:1)
它们不是是同一对象。表达式Foo()
调用类构造函数Foo.__init__
,该构造函数在每次调用时返回对象的新的,唯一的实例。您的两次调用返回两个独立的对象,它们位于不同的内存位置,每个对象包含其自己的x
属性的私有实例。
您可能想了解Python类和实例理论。
答案 1 :(得分:0)
class Foo:
def __init__(self):
self.x = 3
def fcn(self, val):
self.x += val
def __hash__(self):
return hash(self.x)
这将使用self.x
计算哈希值;这意味着当self.x
相同时,哈希将相同。您可以从__hash__
返回任何内容,但为防止一致性错误,如果对象比较相等,则应返回相同的哈希值。有关in the docs的更多信息。
答案 2 :(得分:0)
感谢所有回答的人。没错,实例化同一类对象的新实例实际上并不完全相同,因为它在内存中所占的位置不同。我最终要做的事情类似于@nosklo的建议。
我创建了一个'get_hashables'函数,该函数返回一个字典,该字典包含将构成唯一类对象的类的所有属性,如下所示:
def get_hashables(self):
return {'data': self.data, 'result': self.result}
然后我的main方法将使用这些“可哈希”变量,并对它们进行哈希处理以产生哈希本身。