亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python面向?qū)ο笾^承和多態(tài)用法分析

系統(tǒng) 1886 0

本文實例講述了Python面向?qū)ο笾^承和多態(tài)用法。分享給大家供大家參考,具體如下:

Python 類的繼承和多態(tài)

Python 類的繼承

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

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

定義一個方法print_title():當(dāng)sex是male時,print man;當(dāng)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
  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);使用 class subclass_name(baseclass_name) 來表示繼承;

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

實例化Child的時候,子類繼承了父類的構(gòu)造函數(shù),就需要提供父類Person要求的兩個屬性變量 name 及 sex:

在繼承關(guān)系中,如果一個實例的數(shù)據(jù)類型是某個子類,那它也可以被看做是父類(May 既是 Child 又是 Person)。但是,反過來就不行(Peter 僅是 Person,而不是Child)。

繼承還可以一級一級地繼承下來,就好比從爺爺?shù)桨职?、再到兒子這樣的關(guān)系。而任何類,最終都可以追溯到根類object,這些繼承關(guān)系看上去就像一顆倒著的樹。比如如下的繼承樹:

Python面向?qū)ο笾^承和多態(tài)用法分析_第1張圖片

isinstance()?? 及? issubclass()

Python 與其他語言不同點在于,當(dāng)我們定義一個 class 的時候,我們實際上就定義了一種數(shù)據(jù)類型。我們定義的數(shù)據(jù)類型和Python自帶的數(shù)據(jù)類型,比如str、list、dict沒什么兩樣。

Python 有兩個判斷繼承的函數(shù):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 類的多態(tài)

在說明多態(tài)是什么之前,我們在 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()


          

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

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

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

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

子類重寫構(gòu)造函數(shù)

子類可以沒有構(gòu)造函數(shù),表示同父類構(gòu)造一致;子類也可重寫構(gòu)造函數(shù);現(xiàn)在,我們需要在子類 Child 中新增兩個屬性變量:mother 和 father,我們可以構(gòu)造如下(建議子類調(diào)用父類的構(gòu)造方法,參見后續(xù)代碼):

            
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


          

若父類構(gòu)造函數(shù)包含很多屬性,子類僅需新增1、2個,會有不少冗余的代碼,這邊,子類可對父類的構(gòu)造方法進行調(diào)用,參考如下:

            
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)    # 子類對父類的構(gòu)造方法的調(diào)用
    self.mother = mother
    self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)


          

多重繼承

多重繼承的概念應(yīng)該比較好理解,比如現(xiàn)在需要新建一個類 baby 繼承 Child , 可繼承父類及父類上層類的屬性及方法,優(yōu)先使用層類近的方法,代碼參考如下:

            
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()        # 優(yōu)先使用上層類的方法


          

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計入門與進階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進階經(jīng)典教程》

希望本文所述對大家Python程序設(shè)計有所幫助。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 五月婷婷中文字幕 | 操操碰| 欧美激情一区二区 | 国产在线观看中文字幕 | 一级毛片视频在线观看 | 高清中文字幕视频在线播 | 麻豆国内精品欧美在线 | 国产成人久久精品一区二区三区 | 91精品国产9l久久久久 | 亚洲高清色 | 丁香色综合 | 日日嗷 | 一级毛片免费的 | 精品久久久久久蜜臂a∨ | 韩国19禁青草福利视频在线 | 欧美欧美aaaaa一级毛片 | 男人的天堂免费视频 | 亚洲精品久久9热 | 哪里可以看毛片 | h视频国产| 免费看黄色的网站 | 美女18隐私羞羞视频网站 | 91粉嫩萝控精品福利网站 | 99精品在线免费观看 | 97国产在线视频 | 久久99精品久久久久久青青日本 | 好看的中文字幕在线 | 国产精品视频视频久久 | 日日射夜夜操 | 国内成人免费视频 | 99久久这里只精品麻豆 | 9久热这里只有精品免费 | 一级毛片老太婆交性欧美 | 日本一级高清不卡视频在线 | 四虎影视成人精品 | 亚洲一二区视频 | 欧美精品亚洲精品 | 奇米888888 | 一区二区高清视频 | 四虎精品成在线播放 | 99热国产免费 |