特殊方法
- 現在可以建立並使用基本物件,不過接著要更深入地使用它
- Python 的特殊方法(或許也看過有人將稱為魔術方法)
- 當輸入 a = 3 + 8 這類東西時,值為 3 與 8 的整數物件如何知道該怎麼做 + ?
- 另外,a 如何知道該怎麼用 = 來得到結果?
- 可以將這些運算子叫做 Python 的特殊方法(魔術方法)
- 這些方法名稱的開頭與結尾都做用雙底線()→ 已經看過一個了:__init 會用它的「類別定義」與「被傳入的引數」,來初始化並建立一個物件
【範例】有一個簡單的 word 類別,想要用一個 equals() 方法來比較兩個單字,但忽略大小寫
也就是說,一個含有 'ha' 的 word,將會被當成與含有 'HA' 的相同
【方法一】equals() 方法
- 裡面有一個一般的方法,稱為 equals()
- self.text 是 Word 物件裡面的文字字串 → equals() 方法會將它與 word2 的文字字串比較(另一個 Word 物件)
>>> class Word():
def __init__(self, text)
self.text = text
# 裡面有一個一般的方法,稱為 equals()
# self.text 是 Word 物件裡面的文字字串 → equals() 方法會將它與 word2 的文字字串比較(另一個 Word 物件)
def equals(self, word2):
return self.text.lower() == word2.text.lower()
# 接下來,用三個不同的「文字字串」來製作三個「Word物件」:
>>> first = Word('ha')
>>> second = Word('HA')
>>> third = Word('eh')
# 當比較字串 'ha' 與 'HA' 時,它們應該是相等的:
>>> first.equals(second)
True
# 但字串 'eh' 不符合 'ha':
>>> first.equals(third)
False
【方法二】__eq__() 方法
- 定義 equals() 方法來做這個小寫的轉換與比較
- 比較好的做法是按照 Python 的內建風格,只說 if first == second 就好。所以,我們來做這件事
- 將 equals() 方法改為特殊名稱 __eq__() → 很快就會看到原因
>>> class WOrd():
def __init__(self, text):
self.text = text
def __eq__(self, word2):
return self.text.lower() == word2.text.lower()
>>> first = Word('ha')
>>> second = Word('HA')
>>> third = Word('eh')
>>> first == second
True
>>> first == third
False
列出最實用的魔法方法的名稱
表 6-1 比較魔術方法
比較魔法方法 |
名稱 |
__eq__( self, other ) |
self == other |
__ne__( self, other ) |
self != other |
__lt__( self, other ) |
self < other |
__gt__( self, other ) |
self > other |
__le__( self, other ) |
self <= other |
__ge__( self, other ) |
self >= other |
表 6-2 數學魔術方法
數學魔法方法 |
名稱 |
__add__( self, other ) |
self + other |
__sub__( self, other ) |
self - other |
__mul__( self, other ) |
self * other |
__floordiv__( self, other ) |
self // other |
__truediv__( self, other ) |
self / other |
__mod__( self, other ) |
self % other |
__pow__( self, other ) |
self ** other |
表 6-3 其他的魔術方法
其他的魔術方法 |
名稱 |
__str__( self ) |
str( self ) |
__repr__( self ) |
repr( self ) |
__len( self ) |
len( self ) |
- 除了 __init__() 之外,最常在自己的方法裡面使用的,可能是 __str__() → 那就是印出物件的方式
- print()、str() 與字串格式化程式都會經常使用它(將會在本書第七章看到)
- 互動式解譯器使用 __repr__() 函式輸出變數
如果無法定義 __str_() 或 \_repr(),會取得物件的 Python 預設字串版本
>>> class Word():
def __init__(self, text):
self.text = text
def __eq__(self, word2):
return self.text.lower() == word2.text.lower()
>>> first = Word('ha')
>>> second = Word('HA')
>>> third = Word('eh')
>>> first == second
True
>>> first == third
False
>>> first = Word('ha')
>>> first
<__main__.Word object at 0x102b96e48>
>>> print(first)
<__main__.Word object at 0x102b96e48>
將 __str() 與 __repr() 方法加到 Word 類別,來讓它更完美
如果要研究更特殊的方法,可查看 Python documentation(https://docs.python.org/3.6/reference/datamodel.html)
>>> class Word():
def __init__(self, text):
self.text = text
def __eq__(self, word2):
return self.text.lower() == word2.text.lower()
def __str__(self):
return self.text
def __repr__(self):
return 'Word("' + self.text + '")'
>>> first = Word('ha')
>>> first
Word("ha")
>>> print(first)
ha