Python物件導向編程之繼承與多態詳解,python物件導向編程

來源:互聯網
上載者:User

Python物件導向編程之繼承與多態詳解,python物件導向編程

本文執行個體講述了Python物件導向編程之繼承與多態。分享給大家供大家參考,具體如下:

Python 類的繼承

在OOP(Object Oriented Programming)程式設計中,當我們定義一個class的時候,可以從某個現有的class 繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)。

我們先來定義一個class Person,表示人,定義屬性變數 name 及 sex (姓名和性別);

定義一個方法print_title():當sex是male時,print man;當sex 是female時,print woman。參考如下代碼:

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  passMay = Child("May","female")Peter = Person("Peter","male")print(May.name,May.sex,Peter.name,Peter.sex)  # 子類繼承父類方法及屬性May.print_title()Peter.print_title()

而我們編寫 Child 類,完全可以繼承 Person 類(Child 就是 Person);使用 class subclass_name(baseclass_name) 來表示繼承;

繼承有什麼好處?最大的好處是子類獲得了父類的全部屬性及功能。如下 Child 類就可以直接使用父類的 print_title() 方法

執行個體化Child的時候,子類繼承了父類的建構函式,就需要提供父類Person要求的兩個屬性變數 name 及 sex:

在繼承關係中,如果一個執行個體的資料類型是某個子類,那它也可以被看做是父類(May 既是 Child 又是 Person)。但是,反過來就不行(Peter 僅是 Person,而不是Child)。

繼承還可以一級一級地繼承下來,就好比從爺爺到爸爸、再到兒子這樣的關係。而任何類,最終都可以追溯到根類object,這些繼承關係看上去就像一顆倒著的樹。比如如下的繼承樹:

isinstance()   及  issubclass()

Python 與其他語言不同點在於,當我們定義一個 class 的時候,我們實際上就定義了一種資料類型。我們定義的資料類型和Python內建的資料類型,比如str、list、dict沒什麼兩樣。

Python 有兩個判斷繼承的函數:isinstance() 用於檢查執行個體類型;issubclass() 用於檢查類繼承。參見下方樣本:

class Person(object):  passclass Child(Person):         # Child 繼承 Person  passMay = Child()Peter = Person()print(isinstance(May,Child))     # Trueprint(isinstance(May,Person))    # Trueprint(isinstance(Peter,Child))    # Falseprint(isinstance(Peter,Person))   # Trueprint(issubclass(Child,Person))   # True

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")May = Child("May","female")Peter = Person("Peter","male")print(May.name,May.sex,Peter.name,Peter.sex)May.print_title()Peter.print_title()

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

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

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

對擴充開放(Open for extension):允許子類重寫方法函數

對修改封閉(Closed for modification):不重寫,直接繼承父類方法函數

子類重寫建構函式

子類可以沒有建構函式,表示同父類構造一致;子類也可重寫建構函式;現在,我們需要在子類 Child 中新增兩個屬性變數:mother 和 father,我們可以構造如下(建議子類調用父類的構造方法,參見後續代碼):

class Person(object):  def __init__(self,name,sex):  self.name = name  self.sex = sexclass Child(Person):        # Child 繼承 Person  def __init__(self,name,sex,mother,father):    self.name = name    self.sex = sex    self.mother = mother    self.father = fatherMay = 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 = sexclass Child(Person):             # Child 繼承 Person  def __init__(self,name,sex,mother,father):    Person.__init__(self,name,sex)    # 子類對父類的構造方法的調用    self.mother = mother    self.father = fatherMay = Child("May","female","April","June")print(May.name,May.sex,May.mother,May.father)

多重繼承

多重繼承的概念應該比較好理解,比如現在需要建立一個類 baby 繼承 Child , 可繼承父類及父類上層類的屬性及方法,優先使用層類近的方法,代碼參考如下:

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):  passclass Baby(Child):  passMay = Baby("May","female")    # 繼承上上層父類的屬性print(May.name,May.sex)May.print_title()         # 可使用上上層父類的方法class Child(Person):  def print_title(self):    if self.sex == "male":      print("boy")    elif self.sex == "female":      print("girl")class Baby(Child):  passMay = Baby("May","female")May.print_title()        # 優先使用上層類的方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.