2010-03-31 21 views
2

我創建了下面的類:好的__eq__,__lt__,...,__hash__圖像類的方法?

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__, ...推薦的方法是什麼?

回答

5

您確實需要訂購圖片嗎?如果沒有,我會放棄__lt__方法。對於__hash__,請記住兩個不相等的對象可以具有相同的散列值,因此您可以選擇其中一個屬性(或使用多個屬性的元組)來派生散列碼。例如:

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

我考慮了一類consitent我不得不超負荷'的__eq__,__ne__,__lt__,__le__,__ge__,__gt__,...''而不是__cmp__'。 – 2010-04-01 09:00:07

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 
相關問題