如何在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類相等性的方法。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP