如何在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類相等性的方法。

更新於:2022年9月23日

2K+ 瀏覽量

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.