1. 程式人生 > >什麼是魔法函式?記一次“產臉”後的總結

什麼是魔法函式?記一次“產臉”後的總結

XX:“你覺得你Python掌握程度如何?瞭解,熟悉,還是精通”。 我: “我覺得我自動化測試和工具開發應用的還不少,應該算熟悉吧”。
XX:”那你給我講講什麼是魔法函式?”
我:“…………………………….(感覺像吃了陀翔般難受,明明知道肯定是用過,硬是像不起什麼它的概念,臉產的啪啪響)”

是的,魔法函式,每天都在用,只要寫Python程式碼就會用:

class Test(object):
    def __init__(self):
        pass

是的只要定義一個類,需要再例項建立時對它進行初始化就需要定義init函式,而init函式正式所謂的魔法函式。
其實魔法函式就是Python類中具有特定功能的內建函式。我在使用的時候常常將其過載來實現或擴充套件新的功能(體現的是面向中通過過載來實現多型的思想)

,比如,上述 Test類在定義時,就是過載了基類object的init方法。

一個類內建的的魔法方法,遠不只有init這一個,我們呼叫dir介面,就能看到一個Python類還提供瞭如下這些魔法函式:

print(dir(Test))

#列印結果:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__'
, '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

(還有一些並不能通過dir打印出來,但在IDE做聯想的時候可以選擇…為什麼呢?還沒弄明白)

那麼關於Python預設功能,操作,運算子大多要基於這些魔法引數實現,比如:
這裡寫圖片描述

那麼,只要過載Python所提供功能所對應的魔法函式就可以改變/擴充套件Python所提供的預設的能力(比如運算子)例:

class INT_NUM(int):
    def __init__(self, num):
        self.num = num

    # 過載 == 符號的實現,整數位數的比較
    def __eq__(self, other):
        return len(str(self.num)) == len(str(other.num))


print(INT_NUM(1) == INT_NUM(2))

#列印結果為True

是不是有點像C++裡面運算子過載的意味?