Python面對對象:多態和多態性(詳解)

一、什麼是多態

多態是面向對象的一大顯著特徵,指:不同的子類對象調用相同的父類方法,產生不同的執行結果。

例如同樣是人類,就有醫生和教師的工作職別。
在這裏插入圖片描述

二、什麼是多態性

多態性:指的是使用角度,比如每個人都有同樣的時間,有的人拿去看劇,有的人苦逼寫博客。這就是時間的多態性。

三、多態的好處

在說明多態是什麼之前,我們在 Child 類中重寫 print_title() 方法:若爲male,print boy;若爲female,print girl

'''
多態  :同一種事物的多種形態
'''
class Person(object):
    def __init__(self, name, sex):
        self.name = name
        self.sex = sex
        
    def print_title(self):
        if self.sex == "male":
            print("man")
        elif self.sex == "female":
            print("woman")

class Child(Person):
    # Child 繼承 Person
    def print_title(self):
        if self.sex == "male":
            print("boy")
        elif self.sex == "female":
            print("girl")

Jsan= Child("Jasn", "male")
nancy= Person("nancy", "female")
print(May.name, May.sex, Peter.name, Peter.sex)
May.print_title()
Peter.print_title()


當子類和父類都存在相同的 print_title()方法時,子類的 print_title() 覆蓋了父類的 print_title(),在代碼運行時,會調用子類的 print_title()

這樣,我們就獲得了繼承的另一個好處:多態。

當我們需要傳入更多的子類,例如新增 Seniors等時,我們只需要繼承 Person 類型就可以了,而print_title()方法既可以直不重寫(即使用Person的),也可以重寫一個特有的。這就是多態的意思。調用方只管調用,不管細節,而當我們新增一種Person的子類時,只要確保新方法編寫正確,而不用管原來的代碼。這就是著名的“開閉”原則:

對擴展開放(Open for extension):允許子類重寫方法函數
對修改封閉(Closed for modification):不重寫,直接繼承父類方法函數

總結有如下幾點好處:

  1. 多態可以增加代碼的靈活度。
  2. 以繼承和重寫父類方法爲前提。
  3. 是調用方法的技巧,不會影響到類的內部設計。

四、子類重寫構造函數

子類可以沒有構造函數,表示同父類構造一致;子類也可重寫構造函數;現在,我們需要在子類 Child 中新增兩個屬性變量:mother 和 father,我們可以構造如下:

class Person(object):
  def __init__(self,name,sex):
  self.name = name
  self.sex = sex
class Child(Person):        # Child 繼承 Person
  def __init__(self,name,sex,mother,father):
    self.name = name
    self.sex = sex
    self.mother = mother
    self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)

若父類構造函數包含很多屬性,子類僅需新增1、2個,會有不少冗餘的代碼,這邊,子類可對父類的構造方法進行調用,參考如下:

class Person(object):
  def __init__(self,name,sex):
    self.name = name
    self.sex = sex
class Child(Person):             # Child 繼承 Person
  def __init__(self,name,sex,mother,father):
    Person.__init__(self,name,sex)    # 子類對父類的構造方法的調用
    self.mother = mother
    self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章