如何在 Python 類中使用等價(“相等”)運算子?
使用比較運算子,我們可以在 Python 中比較各種資料型別。在建立自定義類時,我們無法簡單地使用比較運算子來比較它們。
本文將介紹在 Python 類中驗證等價性(“相等性”)的各種方法。
類物件的相等性
== 運算子可以輕鬆確定兩個內建物件(例如字串或整數)是否相等。這在下面的示例中進行了演示。
示例
以下是 == 運算子的示例:
char1 = 365 char2 = 83 result = char1 == char2 print("{} and {} are equivalent to each other:{}".format(char1, char2, result))
輸出
以下是上述程式碼的輸出:
365 and 83 are equivalent to each other:False
注意 - 因為數字 365 和 83 都是整數,所以 == 運算子在此例中返回正確的結果。但是,當處理來自唯一類的物件時,Python 直譯器會表現出不同的行為。
示例
假設 Square 類只有一個屬性 square,如下所示:
class Square: def __init__(self, area): self.square = area print ('equal')
輸出
以下是上述程式碼的輸出:
equal
現在,square 屬性將在 Square 類的兩個例項中設定為相同的面積。
示例
class Square: def __init__(self, area): self.square = area sq1 = Square(23) sq2 = Square(23) print ('equal')
輸出
以下是上述程式碼的輸出:
equal
注意 - 即使兩個例項的 square 屬性具有相同的面積,使用 == 運算子比較物件的返回值也將為 False。這在以下程式碼中顯示:
示例
class Square: def __init__(self, area): self.square = area sq1 = Square(23) sq2 = Square(23) result = sq1 == sq2 print ('sq1 and sq2 are equal:',result)
輸出
以下是上述程式碼的輸出:
sq1 and sq2 are equal: False
注意 - 可以使用 Python 直譯器如何比較來自使用者定義類的兩個物件來解釋上述行為。當我們使用 Python 的 == 運算子比較兩個類物件的相等性時,只有當兩個物件都指向相同的記憶體地址時,結果才會為 True。
換句話說,將只有一個 Python 物件和兩個變數。這在以下示例中可以看到:
示例
class Square: def __init__(self, area): self.square = area sq1 = Square(23) sq2 = sq1 result = sq1 == sq2 print ('sq1 and sq2 are equal:',result)
輸出
以下是上述程式碼的輸出:
sq1 and sq2 are equal: True
現在很清楚,只有當兩個變數都引用使用者定義類的同一個例項時,相等運算子才會返回 True。
使用 __eq__() 方法實現相等
透過覆蓋 __eq__() 方法,我們可以調整 == 運算子相對於自定義類的行為。例如,我們可以覆蓋 __eq__() 函式以比較 Square 類的兩個例項的平方。
以下過程將在 __eq__() 方法中應用:
- 當在 Square 類例項上使用時,__eq__() 方法將接受一個額外的物件作為輸入引數。
- 我們首先將在 __eq__() 方法內部確定輸入物件是否是 Square 類的例項。在這種情況下可以使用 isinstance() 函式。
- isinstance() 函式的第一個和第二個輸入引數分別是類名和 Python 物件。如果物件是執行後輸入引數中指定的類的例項,則返回 True。
- 在我們的程式中,第二個輸入引數將是 Square 類。如果第一個引數的物件不是 Square 類的例項,則它將返回 False。
如果不是,我們將繼續,
- 我們將比較兩個物件中的屬性 square 面積,以確定這兩個物件是否屬於同一個類。如果面積相等,則結果為 True。
如果不是,我們將返回 False。
- 一旦將 __eq__() 方法新增到 Square 類,我們就可以使用 == 運算子適當地比較 Number 類的兩個例項。
- 假設我們有兩個 Square 類例項,我們稱它們為 sq1 和 sq2。當 sq1==sq2 時,將應用 sq1.__eq__(sq2) 函式。
- 與此類似,當我們執行 sq2==sq1 時,將執行 sq2.__eq__(sq1) 方法。
- 程式碼執行後,如果兩個物件的平方面積相等,則 sq1==sq2 將返回 True。如果不是,則返回 False。
我們可以在以下示例中觀察到:
示例
class Square: def __init__(self, area): self.square = area def __eq__(self, other): isSquare = isinstance(other, self.__class__) if not isSquare: return False if self.square == other.square: return True else: return False sq1 = Square(23) sq2 = Square(23) result = sq1 == sq2 print ('sq1 and sq2 are equal:',result)
輸出
以下是上述程式碼的輸出:
sq1 and sq2 are equal: True
使用 id() 方法實現相等
此外,您可以確定具有自定義類物件的兩個變數是否引用同一個物件。為此可以使用 id() 函式。
可以使用 id() 函式在記憶體中的任何位置找到唯一的標識號,該函式接受一個物件作為輸入引數。
示例
以下是 id() 方法的示例:
class Square: def __init__(self, area): self.square = area def __eq__(self, other): isSquare = isinstance(other, self.__class__) if not isSquare: return False if self.square == other.square: return True else: return False sq1 = Square(23) sq2 = Square(23) result1 = id(sq1) result2 = id(sq2) print ('The sq1 id is:',result1) print ('The sq2 id is:',result2)
輸出
以下是上述程式碼的輸出:
The sq1 id is: 2632227365088 The sq2 id is: 2632227365232
注意 - 如果兩個物件都引用同一個記憶體位置,則 id() 函式將對這兩個物件返回相同的結果。我們可以透過比較 id() 函式的輸出(如以下示例所示)來確定兩個物件是否引用同一個記憶體地址:
示例
class Square: def __init__(self, area): self.square = area def __eq__(self, other): isSquare = isinstance(other, self.__class__) if not isSquare: return False if self.square == other.square: return True else: return False sq1 = Square(23) sq2 = Square(23) result1 = id(sq1) result2 = id(sq2) result = result1 == result2 print ('sq1 and sq2 are equal:',result2)
輸出
以下是上述程式碼的輸出:
sq1 and sq2 are equal: 2284484764016
如您所見,在這種情況下,我們沒有檢查物件的屬性面積來確定它們是否屬於同一個類。
在這種情況下,我們只是確定物件是否引用同一個記憶體區域。因此,在類宣告中不包含 __eq__() 函式的情況下使用 == 運算子等同於使用這種確定 Python 類相等性的方法。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP