最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

Python類(lèi)的繼承

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

我們先來(lái)定義一個(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)  # 子類(lèi)繼承父類(lèi)方法及屬性
May.print_title()
Peter.print_title()

而我們編寫(xiě)Child類(lèi),完全可以繼承Person類(lèi)(Child就是Person);使用classsubclass_name(baseclass_name)來(lái)表示繼承;

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

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

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

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

isinstance()及issubclass()

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

Python有兩個(gè)判斷繼承的函數(shù):isinstance()用于檢查實(shí)例類(lèi)型;issubclass()用于檢查類(lèi)繼承。參見(jiàn)下方示例:

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類(lèi)的多態(tài)

在說(shuō)明多態(tài)是什么之前,我們?cè)贑hild類(lèi)中重寫(xiě)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)子類(lèi)和父類(lèi)都存在相同的print_title()方法時(shí),子類(lèi)的print_title()覆蓋了父類(lèi)的print_title(),在代碼運(yùn)行時(shí),會(huì)調(diào)用子類(lèi)的print_title()

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

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

對(duì)擴(kuò)展開(kāi)放(Openforextension):允許子類(lèi)重寫(xiě)方法函數(shù)

對(duì)修改封閉(Closedformodification):不重寫(xiě),直接繼承父類(lèi)方法函數(shù)

子類(lèi)重寫(xiě)構(gòu)造函數(shù)

子類(lèi)可以沒(méi)有構(gòu)造函數(shù),表示同父類(lèi)構(gòu)造一致;子類(lèi)也可重寫(xiě)構(gòu)造函數(shù);現(xiàn)在,我們需要在子類(lèi)Child中新增兩個(gè)屬性變量:mother和father,我們可以構(gòu)造如下(建議子類(lèi)調(diào)用父類(lèi)的構(gòu)造方法,參見(jiàn)后續(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

若父類(lèi)構(gòu)造函數(shù)包含很多屬性,子類(lèi)僅需新增1、2個(gè),會(huì)有不少冗余的代碼,這邊,子類(lèi)可對(duì)父類(lèi)的構(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)    # 子類(lèi)對(duì)父類(lèi)的構(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è)類(lèi)baby繼承Child,可繼承父類(lèi)及父類(lèi)上層類(lèi)的屬性及方法,優(yōu)先使用層類(lèi)近的方法,代碼參考如下:

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")    # 繼承上上層父類(lèi)的屬性
print(May.name,May.sex)      
May.print_title()         # 可使用上上層父類(lèi)的方法


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)先使用上層類(lèi)的方法

總結(jié)

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

相關(guān)文章

  • python實(shí)現(xiàn)新年倒計(jì)時(shí)實(shí)例代碼

    python實(shí)現(xiàn)新年倒計(jì)時(shí)實(shí)例代碼

    大家好,本篇文章主要講的是python實(shí)現(xiàn)新年倒計(jì)時(shí)實(shí)例代碼,昂星期的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Python中字典的緩存池

    Python中字典的緩存池

    這篇文章主要介紹了Python中字典的緩存池,字典的緩存池采用數(shù)組實(shí)現(xiàn)的,并且容量也是80個(gè),下文詳細(xì)介紹需要的小伙伴可以參考一下
    2022-05-05
  • Pyscript使用本地Pyodide配置步驟

    Pyscript使用本地Pyodide配置步驟

    PyScript是“一個(gè)用于在 HTML(如 PHP)中交錯(cuò) Python 的系統(tǒng),這篇文章主要介紹了Pyscript使用本地Pyodide配置方法,需要的朋友可以參考下
    2022-12-12
  • python使用opencv對(duì)圖像mask處理的方法

    python使用opencv對(duì)圖像mask處理的方法

    這篇文章主要介紹了python使用opencv對(duì)圖像mask處理的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 使用原生Python編寫(xiě)Hadoop?MapReduce程序

    使用原生Python編寫(xiě)Hadoop?MapReduce程序

    在大數(shù)據(jù)處理領(lǐng)域,Hadoop?MapReduce是一個(gè)廣泛使用的框架,用于處理和生成大規(guī)模數(shù)據(jù)集,本文將使用原生Python編寫(xiě)Hadoop?MapReduce程序,需要的可以參考下
    2025-02-02
  • Python讀取中文路徑出現(xiàn)亂碼問(wèn)題的解決方案

    Python讀取中文路徑出現(xiàn)亂碼問(wèn)題的解決方案

    小編在使用opencv讀取帶有中文路徑的圖片時(shí),發(fā)現(xiàn)會(huì)出現(xiàn)亂碼的情況,當(dāng)讀取的文件路徑出現(xiàn)中文時(shí),(文件夾名為中文或者文件為中文)出現(xiàn)錯(cuò)誤,所以本文給大家介紹了Python讀取中文路徑出現(xiàn)亂碼問(wèn)題的解決方案,需要的朋友可以參考下
    2024-06-06
  • 詳解Python中的字符串格式化

    詳解Python中的字符串格式化

    這篇文章主要為大家介紹了Python中的字符串格式化,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • Windows系統(tǒng)下PhantomJS的安裝和基本用法

    Windows系統(tǒng)下PhantomJS的安裝和基本用法

    今天小編就為大家分享一篇關(guān)于Windows系統(tǒng)下PhantomJS的安裝和基本用法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • python dataframe astype 字段類(lèi)型轉(zhuǎn)換方法

    python dataframe astype 字段類(lèi)型轉(zhuǎn)換方法

    下面小編就為大家分享一篇python dataframe astype 字段類(lèi)型轉(zhuǎn)換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python個(gè)人博客程序開(kāi)發(fā)實(shí)例框架設(shè)計(jì)

    Python個(gè)人博客程序開(kāi)發(fā)實(shí)例框架設(shè)計(jì)

    這篇文章主要介紹了怎樣用Java來(lái)實(shí)現(xiàn)一個(gè)完整的個(gè)人博客系統(tǒng),我們通過(guò)實(shí)操上手的方式可以高效的鞏固所學(xué)的基礎(chǔ)知識(shí),感興趣的朋友一起來(lái)看看吧
    2022-12-12

最新評(píng)論

礼泉县| 安塞县| 盈江县| 缙云县| 当阳市| 兴海县| 贵德县| 资兴市| 宁乡县| 凌源市| 娄烦县| 苍溪县| 宁德市| 望都县| 黄梅县| 泗洪县| 永靖县| 新丰县| 方正县| 绵竹市| 呼和浩特市| 乌鲁木齐县| 迁西县| 沅陵县| 高雄县| 卢氏县| 岳普湖县| 托里县| 定襄县| 信宜市| 山丹县| 新安县| 广安市| 荃湾区| 阿拉善右旗| 金川县| 高陵县| 东海县| 垦利县| 新兴县| 凤山县|