2010-08-23 163 views
17

是否有任何方法檢查兩個對象是否具有相同的值,而不是遍歷其屬性並手動比較它們的值?比較兩個對象

+0

參見[這類似的問題(http://stackoverflow.com/問題/ 390250 /優雅的方式支持等價 - 在Python中的類相等) – GreenMatt 2010-08-23 18:28:08

回答

8

@Joe金頓公司的解決方案工作,如果有一個__dict__(一些對象,包括內建命令,沒有之一),__eq__作品(一寫的不好__eq__ mayraise異常等)兩種類型的字典的所有值。但這是非常不可寬恕的。它甚至沒有正確處理名義上的亞型......更少的結構亞型(即你可以使用的類型/用於鴨式打字)。 不要這樣做。

但通常情況下,您最好使用手工定製的__eq__方法,該方法只比較一些重要的屬性。例如。理性只應該比較分子和分母,僅此而已。

+2

「一些無意義的比較可能會引發異常」:nope,這僅適用於涉及排序的比較 - 檢查「a」是否等於b(即,「a == b」,表達或暗示)**永不**原因異常(除非你故意編寫一個奇怪的類來覆蓋'__eq__',僅僅是爲了引起這樣的異常;-)。 IOW,平等/不平等的比較**從不**「無意義」。 – 2010-08-23 18:29:37

+0

@Alex Or除非有人編寫這樣的類。寫得很差的課程經常發生。但是,delnan似乎意味着一些內建類型以這種方式表現出來,這確實是不正確的。 – 2010-08-23 18:37:03

+0

是的,內置的不這樣做。對不起,如果它是這樣讀的。 – delnan 2010-08-23 18:41:12

-4

object1.__dict__ == object2.__dict__應該是你所需要的,我想......

編輯:vars(object1) == vars(object2)也許是更Python了一下,雖然@delnan使有關對象(例如int s)表示,沒有一個有效的點__dict__。我不同意自定義__eq__對於簡單情況是一種更好的方法,但是......有時候,如果快速和骯髒完美地完成你所需要的,i.m.h.o.

+8

直接觸摸__dict__基本上總是錯誤的。 – habnabit 2010-08-23 18:27:53

+2

@Aaron,我同意直接修改'__dict__'基本上總是錯的......我不同意直接閱讀它基本上總是錯的。也許'瓦爾斯'有點清晰,但... – 2010-08-23 18:43:01

+3

不,讀它基本上總是錯誤的。它繞過描述符協議,更不用說它依賴於實現細節。 – habnabit 2010-08-23 18:43:41

6

,闡述對delnan的回答是:

​​3210
2

您可以直接比較namedtuple
否則,您必須定義無論是你自己豐富的比較__eq__和可能__ne__
或您自己的__cmp__

看到datamodel更多信息