欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python類的繼承和多態(tài)代碼詳解

 更新時(shí)間:2017年12月27日 15:51:34   作者:feesland  
這篇文章主要介紹了Python類的繼承和多態(tài)代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下

Python類的繼承

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

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

定義一個(gè)方法print_title():當(dāng)sex是male時(shí),printman;當(dāng)sex是female時(shí),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()方法

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

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

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

isinstance()及issubclass()

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

Python有兩個(gè)判斷繼承的函數(shù):isinstance()用于檢查實(shí)例類型;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,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()

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

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

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

對擴(kuò)展開放(Openforextension):允許子類重寫方法函數(shù)

對修改封閉(Closedformodification):不重寫,直接繼承父類方法函數(shù)

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

子類可以沒有構(gòu)造函數(shù),表示同父類構(gòu)造一致;子類也可重寫構(gòu)造函數(shù);現(xiàn)在,我們需要在子類Child中新增兩個(gè)屬性變量: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è),會有不少冗余的代碼,這邊,子類可對父類的構(gòu)造方法進(jìn)行調(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)在需要新建一個(gè)類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)先使用上層類的方法

總結(jié)

以上就是本文關(guān)于Python類的繼承和多態(tài)代碼詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • pyspark給dataframe增加新的一列的實(shí)現(xiàn)示例

    pyspark給dataframe增加新的一列的實(shí)現(xiàn)示例

    這篇文章主要介紹了pyspark給dataframe增加新的一列的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Pandas執(zhí)行SQL操作的實(shí)現(xiàn)

    Pandas執(zhí)行SQL操作的實(shí)現(xiàn)

    使用SQL語句能夠完成對table的增刪改查操作,Pandas同樣也可以實(shí)現(xiàn)SQL語句的基本功能,本文就來介紹一下,具有一檔的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • Python編程使用tkinter模塊實(shí)現(xiàn)計(jì)算器軟件完整代碼示例

    Python編程使用tkinter模塊實(shí)現(xiàn)計(jì)算器軟件完整代碼示例

    這篇文章主要介紹了Python編程實(shí)現(xiàn)一個(gè)計(jì)算器軟件完整代碼示例,簡單介紹了Tkinter的相關(guān)內(nèi)容,然后分享了通過tkinter模塊開發(fā)一個(gè)計(jì)算器的完整Python代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • 對numpy中array和asarray的區(qū)別詳解

    對numpy中array和asarray的區(qū)別詳解

    下面小編就為大家分享一篇對numpy中array和asarray的區(qū)別詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python文件操作方法詳解

    Python文件操作方法詳解

    這篇文章主要介紹了Python文件操作方法詳解,需要的朋友可以參考下
    2020-02-02
  • 如何使用pandas對超大csv文件進(jìn)行快速拆分詳解

    如何使用pandas對超大csv文件進(jìn)行快速拆分詳解

    Pandas是Python語言的一個(gè)擴(kuò)展程序庫,提供高性能、易于使用的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具,下面這篇文章主要給大家介紹了關(guān)于如何使用pandas對超大csv文件進(jìn)行快速拆分的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Pandas的數(shù)據(jù)過濾實(shí)現(xiàn)

    Pandas的數(shù)據(jù)過濾實(shí)現(xiàn)

    這篇文章主要介紹了Pandas的數(shù)據(jù)過濾實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python依賴包整體遷移方法詳解

    Python依賴包整體遷移方法詳解

    這篇文章主要介紹了Python依賴包整體遷移方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python裝飾器原理與用法深入詳解

    python裝飾器原理與用法深入詳解

    這篇文章主要介紹了python裝飾器原理與用法,結(jié)合實(shí)例形式深入分析了Python裝飾器的概念、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • 基于OpenCv實(shí)現(xiàn)的人臉識別(附Python完整代碼)

    基于OpenCv實(shí)現(xiàn)的人臉識別(附Python完整代碼)

    人臉識別是基于人的臉部特征信息進(jìn)行身份識別的一種生物識別技術(shù),下面這篇文章主要給大家介紹了關(guān)于如何基于OpenCv實(shí)現(xiàn)的人臉識別,文中還附Python完整代碼,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11

最新評論