图像类的__eq__、__lt__等__hash__方法怎么写?

2 投票
2 回答
785 浏览
提问于 2025-04-15 21:06

我创建了一个这样的类:

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 个回答

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
5

你真的需要这些图片按顺序排列吗?如果不需要的话,我建议你可以去掉 __lt__ 这个方法。至于 __hash__,要记住两个不相等的对象可能会有相同的哈希值,所以你可以选择其中一个属性(或者用多个属性组成一个元组)来生成哈希值。比如:

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

撰写回答