特殊方法

  • 現在可以建立並使用基本物件,不過接著要更深入地使用它
  • Python 的特殊方法(或許也看過有人將稱為魔術方法
    • 當輸入 a = 3 + 8 這類東西時,值為 3 與 8 的整數物件如何知道該怎麼做 + ?
    • 另外,a 如何知道該怎麼用 = 來得到結果?
    • 可以將這些運算子叫做 Python 的特殊方法(魔術方法)
    • 這些方法名稱的開頭與結尾都做用雙底線()→ 已經看過一個了:__init 會用它的「類別定義」與「被傳入的引數」,來初始化並建立一個物件

【範例】有一個簡單的 word 類別,想要用一個 equals() 方法來比較兩個單字,但忽略大小寫

也就是說,一個含有 'ha' 的 word,將會被當成與含有 'HA' 的相同

【方法一】equals() 方法

  1. 裡面有一個一般的方法,稱為 equals()
  2. 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__() 方法

  1. 定義 equals() 方法來做這個小寫的轉換與比較
  2. 比較好的做法是按照 Python 的內建風格,只說 if first == second 就好。所以,我們來做這件事
  3. 將 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

# 見證到魔法了!要測試相等與否,只要使用 Python 的特殊方法名稱 __eq__() 就可以了

列出最實用的魔法方法的名稱

表 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
  • +(魔術方法 __add__()) 與 - (魔術方法 __sub__()) 等數學運算子並非只能用在數字上
  • 例如:Python 字串物件可使用 + 來做串接,用 * 來做重複
  • Special method names 還有許多線上文字可供參考:https://docs.python.org/3.6/reference/datamodel.html
  • 表 6-3 是最常見的部分

表 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')

# 如果無法定義 __str__() 或 __repr(),會取得物件的 Python 預設字串版本
>>> 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               # uses __repr__
Word("ha")
>>> print(first)        # uses __str__
ha

results matching ""

    No results matching ""