好的__eq __,__ lt __,...,__ hash__图像类的方法?

时间:2010-03-31 18:10:42

标签: python

我创建了以下类:

class Image(object):
    def __init__(self, extension, data, urls=None, user_data=None):
        self._extension = extension
        self._data = data
        self._urls = urls
        self._user_data = user_data
        self._hex_digest = hashlib.sha1(self._data).hexDigest()

当所有值相等时,图像应该相等。因此我写道:

    def __eq__(self, other):
        if isinstance(other, Image) and self.__dict__ == other.__dict__:
            return True
        return False

    def __ne__(self, other):
        return not self.__eq__(other)

    def __lt__(self, other):
        return self.__dict__ < other.__dict__
    ...

但是__hash__方法应该怎么样?相等的图像应该返回相等的哈希...

    def __hash__(self):
        # won't work !?!  
        return hash(self.__dict__)

我尝试使用__eq__, __ne__, __lt__, __hash__, ...的方式是推荐吗?

2 个答案:

答案 0 :(得分:5)

你真的需要订购图像吗?如果没有,我会放弃__lt__方法。对于__hash__,请记住两个不相等的对象可以具有相同的哈希值,因此您可以选择一个属性(或使用多个属性的元组)来派生哈希码。例如:

def __hash__(self):
    return hash(self._hex_digest)

答案 1 :(得分:1)

你看过字典比较的规则了吗?

点击此处:http://docs.python.org/reference/expressions.html#notin

这尚未明确定义(尚未)。它可以在“什么是新的”文档中定义。

然而,小型测试似乎表明这是可行的。

>>> a= { 'a':1, 'b':2 }
>>> b= { 'a':2, 'b':2 }
>>> a == a
True
>>> a == b
False
>>> a < b
True
>>> a > b
False
>>> a >= b
False