python2.7, 新手问题, 代码如下:
class A(object):
def __init__(self):
pass
a = A()
b = A()
为什么a == A()
,a == b
的返回结果都为False
?
感觉很不合逻辑啊? 这是为什么?
收到解答, 那么又有了新的问题, 代码如下:
class A(object):
def __init__(self, *args):
self.args = args
def __eq__(self, another):
if type(self) == type(another) and self.__dict__ == self.__dict__:
return True
return False
a = A(1)
b = A(1)
print a==b
print [a] == [b]
print set([a]) == set([b])
结果为 True, True, False 为什么set
会出现不一样的情况?
實際上是呼叫__eq__操作符重載來監測物件是否相等,可見
監測物件位址用id()函數,例如 id(a) == id(b) 列印a和b是否指向一個位址, 比較物件內容和物件位址是2個意思,請參見
#🎜#1) 判斷語句應該是if type(self) == type(another) and self.__dict__ == another.__dict__,後面不是self,筆誤2) 你可以在__eq__裡加上print "__eq__ called",明顯是轉換成set之後比較不是用這個__eq__,而是__hash__方法
3) 盡量不要用__dict_ _吧,我個人覺得你明確用args已經很好了
4) 我個人不太喜歡用type來檢查類型,更喜歡下面的方式
List 比較用的是
__eq__
Set 比较用的是
__hash__
, 因为本质上 set 是个建立在 dict(哈希表)上的结构.你需要重载
__hash__
.See more http://stackoverflow.com/questions/15326985/how-to-implement-eq-for-set-inclusion-test326985/how-to-implement-eq-for-set-inclusion-test326985/how-to-implement-eq-for-set-inclusion-test#🎜#🎜# #