讓父系幫助你【使用 super】

  • 之前看過子類別如何添加或覆寫父類別的方法

【範例一】如果想要呼叫父類別的方法時,該怎麼辦?只要說 super()

>>> class 父類別名稱():
        def __init__(self, name):
            self.name = name

# 注意以下「子類別」內的 __init__() 呼叫式有新的「email 參數」
# 當為類別定義__init__()方法時,代表要用它來取代父類別的 __init__() 方法 → 再也不會自動呼叫父類別的 __init__() 方法,所以必須明確地呼叫它
# __init__()方法呼叫「父類別.__init__()」方法 → 負責將 self 引數傳給父類別,所以只要提供選用的引數給它就行了 → 此範例:父類別名稱() 收到的其他引數只有 name
>>> class 子類別名稱(父類別名稱):
        def __init__(self, name, email):
            super().__init__(name)         # super() 取得父類別的定義
            self.email = email             # self.email = email,這一行是新的程式 → 就是因為它,才讓「子類別」與「父類別」有所差異

# 接著,來製作其中一個物件
>>> 文字 = 子類別名稱('字串1', '字串2')

# 可以存取 name 與 email 屬性
>>> 文字.name
字串1
>>> 文字.email
字串2
# 首先,是我們熟悉的 Person 定義
>>> class Person():
    def __init__(self, name):
        self.name = name

# 接著,要定義一個名為 EmailPerson 的新類別,它代表 Person 與 email 地址
# 當為類別定義 __init__()方法時,代表要用它來取代父類別的 __init__() 方法 → 再也不會自動呼叫父類別的 __init__() 方法,所以必須明確地呼叫它
# super() 取得父類別 Person 的定義
# __init__()方法呼叫「Person.__init__()」方法 → 負責將 self 引數傳給父類別,所以只要提供選用的引數給它就行了 → 此範例:Person() 收到的其他引數只有 name
>>> class EmailPerson(Person):
    def __init__(self, name, email):   # 注意子類別內的 __init()__() 呼叫式有新的 email 參數
        super().__init__(name)
        self.email = email             # self.email = email,這一行是新的程式 → 就是因為它,才讓 EmailPerson 與 Person 有所差異

# 接著,來製作其中一個物件
>>> bob = EmailPerson('Bob Frapples', '[email protected]')

# 可以存取 name 與 email 屬性
>>> bob.name
'Bob Frapples'
>>> bob.email
'[email protected]'

【範例二】這種做法也可以,但會破壞繼承的使用

>>> class 子類別名稱(父類別名稱):
        def __init__(self, name, email):
            self.name = name
            self.email = email
>>> class EmailPerson(Person):
        def __init__(self, name, email):
            self.name = name
            self.email = email
  • 為什麼不像這樣定義新類別就好? → 這種做法也可以,但是它會破壞繼承的使用

使用 super() 好處

* 使用 super() 來讓「父類別 Person」做它的工作,與一般的「父類別 Person 物件」做的事情一樣
* 如果以後「父類別 Person」的定義被改變了,使用 super() 可確保「子類別 EmailPerson」從「父類別 Person」繼承來的屬性與方法,可以反應它的改變
* 如果「子類別」會使用它自己的方法來做事,但仍然需要用到「父類別」的東西,請使用 super()

results matching ""

    No results matching ""