我正在嘗試創建一個在集合操作中行爲正常的自定義對象。集合操作中對象的行爲
我已經普遍認識到它的工作原理,但是我想確保我完全理解它的含義。特別是,當對象中有其他數據未包含在equal/hash方法中時,我對這種行爲感興趣。看起來,在「交集」操作中,它返回被比較的對象集合,其中'聯合'操作返回被比較的對象集合。
舉例說明:
class MyObject:
def __init__(self,value,meta):
self.value = value
self.meta = meta
def __eq__(self,other):
return self.value == other.value
def __hash__(self):
return hash(self.value)
a = MyObject('1','left')
b = MyObject('1','right')
c = MyObject('2','left')
d = MyObject('2','right')
e = MyObject('3','left')
print a == b # True
print a == C# False
for i in set([a,c,e]).intersection(set([b,d])):
print "%s %s" % (i.value,i.meta)
#returns:
#1 right
#2 right
for i in set([a,c,e]).union(set([b,d])):
print "%s %s" % (i.value,i.meta)
#returns:
#1 left
#3 left
#2 left
這種行爲的地方,並確定記錄?如果是這樣,那麼治理原則是什麼?
望着文檔的__hash__方法,它不會出現,表明不可能有未散列對象中的數據。我可以想到許多例子,其中兩個相同的對象將具有不同的某種形式的元數據(可能是時間戳或文件名)。 從__hash__的文檔:唯一需要的屬性是比較相等的對象具有相同的散列值;建議以某種方式混合在一起(例如,使用排他或散列值)用於對象的組成部分,這些組成部分也是對象比較的一部分。 – 2010-04-07 19:10:33
我對你的評論感到困惑,你似乎同意我的看法。如果一個對象具有被eq和hash忽略的元數據(例如時間戳或文件名),那麼它們不夠重要,不能被保存,要麼被比較的對象會做。如果它們足夠重要以區分這兩個對象,它們將被包含在散列和等式中。你現在在問什麼? – hlfrk414 2010-04-07 19:22:33
我並不贊同你;)。試圖瞭解如何使用這些功能。在這種情況下,我有一個由監視代理創建的對象。嘗試關聯具有不同時間戳的重複性警報條件。寧願保留舊的對象,但當然我可以用其他方式實現它,因爲我懷疑你是正確的。 – 2010-04-07 19:46:40