熱線電話:13121318867

登錄
首頁精彩閱讀Python類的繼承和多態代碼詳解
Python類的繼承和多態代碼詳解
2018-01-25
收藏

Python類的繼承和多態代碼詳解

Python類的繼承

在OOP(ObjectOrientedProgramming)程序設計中,當我們定義一個class的時候,可以從某個現有的class繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Baseclass、Superclass)。
我們先來定義一個classPerson,表示人,定義屬性變量name及sex(姓名和性別);
定義一個方法print_title():當sex是male時,printman;當sex是female時,printwoman。參考如下代碼:    
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
  pass
       
May = 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);使用classsubclass_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):
  pass
 
class Child(Person):         # Child 繼承 Person
  pass
 
May = Child()
Peter = Person()  
 
print(isinstance(May,Child))     # True
print(isinstance(May,Person))    # True
print(isinstance(Peter,Child))    # False
print(isinstance(Peter,Person))   # True
print(issubclass(Child,Person))   # True

Python類的多態

在說明多態是什么之前,我們在Child類中重寫print_title()方法:若為male,printboy;若為female,printgirl    
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的子類時,只要確保新方法編寫正確,而不用管原來的代碼。這就是著名的“開閉”原則:
對擴展開放(Openforextension):允許子類重寫方法函數
對修改封閉(Closedformodification):不重寫,直接繼承父類方法函數

子類重寫構造函數
子類可以沒有構造函數,表示同父類構造一致;子類也可重寫構造函數;現在,我們需要在子類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)  
 
Person
若父類構造函數包含很多屬性,子類僅需新增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)

多重繼承

多重繼承的概念應該比較好理解,比如現在需要新建一個類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):
  pass
 
class Baby(Child):
  pass
 
May = 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):
  pass
       
May = Baby("May","female")
May.print_title()        # 優先使用上層類的方法
總結
以上就是本文關于Python類的繼承和多態代碼詳解的全部內容,希望對大家有所幫助。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢