原文鏈接:http://www.yihaomen.com/article/python/281.htm
對於同一個Class,可以創建不同的實例(instance), 如何比較這兩個 instance 是否相等呢?我們知道,對於計算機來說,要判斷兩個對象是否相等,就是看在內存中的地址是否同一個。如果內存地址一樣,那么肯定是相等的。這種情況通常出 現在一個對象是另外一個對象的引用時出現。
但在實際的開發過程中,要比較兩個對象是否相等,並不是通過內存地址來判斷的,而是通過這兩個對象的部分屬性值,或者全部屬性值來對比判斷的。
假設有一個職員Class, 我們分別創建了兩個對象

class Staff(object):
def __init__(self,id,name,sex):
self.id=id
self.name=name
self.sex=sex
我們這樣認為,如果id 相同,則表示兩個對象相等,id姑且表示身份證編號吧,如果身份證編號相同,那么肯定是同一人,在實際的項目中會遇到這樣的情況。
創建對象並查看各自的內存地址

staff1=Staff("123456","張三","男")
staff2=Staff("123456","李四","女")
print id(staff1),id(staff2)
#12327248 12327184
結果很明顯,在不同的內存地址,這時候如果判斷 staff1==staff2 ,結果肯定是 False。
如何滿足我們的需要,只要id 相同的對象,就認為是相等的對象呢,有如下幾種方法:
一.重載 Staff Class 的 __eq__ 方法

class Staff(object):
def __init__(self,id,name,sex):
self.id=id
self.name=name
self.sex=sex
def __eq__(self,other):
return self.id==other.id
staff1=Staff("123456","張三","男")
staff2=Staff("123456","李四","女")
print id(staff1),id(staff2)
print staff1==staff2
#True
結果返回為 true,說明是相等的,但在計算機中的內存地址,肯定是不一樣的。這里重載了__eq__方法,當然你還可以 增加比較條件,例子中只對比了id. 用同樣的方法,還可以實現 兩個對象相加等操作,重載__add__ 方法。
2.直接屬性值對比來實現

staff1=Staff("123456","張三","男")
staff2=Staff("123456","李四","女")
print id(staff1),id(staff2)
print staff1.__dict__
print staff2.__dict__
if staff1.__dict__['id']==staff2.__dict__['id']:
print 'yes,equal'
你會發現,這樣也是可以的,同樣也可以對比多個屬性,這里的重點是用到了python Class 的 __dict__系統內置方法來實現。