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

Python高級(jí)編程之繼承問題詳解(super與mro)

 更新時(shí)間:2019年11月19日 11:53:57   作者:HMMHMH  
這篇文章主要介紹了Python高級(jí)編程之繼承問題,結(jié)合實(shí)例形式詳細(xì)分析了Python多繼承、MRO順序及super調(diào)用父類等相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Python高級(jí)編程之繼承問題。分享給大家供大家參考,具體如下:

多繼承問題

1.單獨(dú)調(diào)用父類:

一個(gè)子類同時(shí)繼承自多個(gè)父類,又稱菱形繼承、鉆石繼承。

使用父類名.init(self)方式調(diào)用父類時(shí):

例:

class Parent(object):
  def __init__(self, name):
    self.name = name
    print('parent的init結(jié)束被調(diào)用')
class Son1(Parent):
  def __init__(self, name, age):
    Parent.__init__(self, name)
    self.age = age
    print('Son1的init結(jié)束被調(diào)用')
class Son2(Parent):
  def __init__(self, name, gender):
    Parent.__init__(self, name)
    self.gender = gender
    print('Son2的init結(jié)束被調(diào)用')
class Grandson(Son1, Son2):
  def __init__(self, name, age, gender):
    Son1.__init__(self, name, age) # 單獨(dú)調(diào)用父類的初始化方法
    Son2.__init__(self, name, gender)
    print('Grandson的init結(jié)束被調(diào)用')
gs = Grandson('grandson', 12, '男')

執(zhí)行結(jié)果:

可以看出使用父類名.init(self)方式調(diào)用父類時(shí),parent父類被調(diào)用了兩次,此方法對(duì)于多繼承不太合適。

2.MRO順序:

上述代碼,我們發(fā)現(xiàn)由于多繼承情況,parent類被的屬性被構(gòu)造了兩次,如果在更加復(fù)雜的結(jié)構(gòu)下可能更加嚴(yán)重。

為了解決這個(gè)問題,Python官方采用了一個(gè)算法將復(fù)雜結(jié)構(gòu)上所有的類全部都映射到一個(gè)線性順序上,而根據(jù)這個(gè)順序就能夠保證所有的類都會(huì)被構(gòu)造一次。

這個(gè)順序就是MRO順序。

MRO順序采用C3算法廣度優(yōu)先遍歷。

使用方法: 類名.mro()或類名.mro()

3.super調(diào)用父類:

使用super().init()方式調(diào)用父類時(shí):

例:

class Parent(object):
  def __init__(self, name, *args, **kwargs): # 為避免多繼承報(bào)錯(cuò),使用不定長(zhǎng)參數(shù),接受參數(shù)
    self.name = name
    print('parent的init結(jié)束被調(diào)用')
class Son1(Parent):
  def __init__(self, name, age, *args, **kwargs): # 為避免多繼承報(bào)錯(cuò),使用不定長(zhǎng)參數(shù),接受參數(shù)
    self.age = age
    super().__init__(name, *args, **kwargs) # 為避免多繼承報(bào)錯(cuò),使用不定長(zhǎng)參數(shù),接受參數(shù)
    print('Son1的init結(jié)束被調(diào)用')
class Son2(Parent):
  def __init__(self, name, gender, *args, **kwargs): # 為避免多繼承報(bào)錯(cuò),使用不定長(zhǎng)參數(shù),接受參數(shù)
    self.gender = gender
    super().__init__(name, *args, **kwargs) # 為避免多繼承報(bào)錯(cuò),使用不定長(zhǎng)參數(shù),接受參數(shù)
    print('Son2的init結(jié)束被調(diào)用')
class Grandson(Son1, Son2):
  def __init__(self, name, age, gender):
    # 多繼承時(shí),相對(duì)于使用類名.__init__方法,要把每個(gè)父類全部寫一遍
    # 而super只用一句話,執(zhí)行了全部父類的方法,這也是為何多繼承需要全部傳參的一個(gè)原因
    # super(Grandson, self).__init__(name, age, gender)
    super().__init__(name, age, gender)
    print('Grandson的init結(jié)束被調(diào)用')
gs = Grandson('grandson', 12, '男')
print(Grandson.__mro__)

運(yùn)行結(jié)果:

parent父類只被調(diào)用了一次,super方法會(huì)按照MRO順序調(diào)用下一個(gè)父類。

總結(jié):

(1)MRO保證了多繼承情況 每個(gè)類只出現(xiàn)一次

(2)super().init相對(duì)于類名.init,在單繼承上用法基本無(wú)差

(3)但在多繼承上有區(qū)別,super方法能保證每個(gè)父類的方法只會(huì)執(zhí)行一次,而使用類名的方法會(huì)導(dǎo)致方法被執(zhí)行多次

(4)多繼承時(shí),使用super方法,對(duì)父類的傳參數(shù),是由于python中super的算法導(dǎo)致的原因,必須把參數(shù)全部傳遞,否則會(huì)報(bào)錯(cuò)

(5)單繼承時(shí),使用super方法,不能全部傳遞,只能傳父類方法所需的參數(shù),否則會(huì)報(bào)錯(cuò)

(6)多繼承時(shí),相對(duì)于使用類名.init方法,要把每個(gè)父類全部寫一遍, 而使用super方法,只需寫一句話便執(zhí)行了全部父類的方法,這也是為何多繼承需要全部傳參的一個(gè)原因

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

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

相關(guān)文章

  • python 并發(fā)編程 非阻塞IO模型原理解析

    python 并發(fā)編程 非阻塞IO模型原理解析

    這篇文章主要介紹了python 并發(fā)編程 非阻塞IO模型原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 關(guān)于windos10環(huán)境下編譯python3版pjsua庫(kù)的問題

    關(guān)于windos10環(huán)境下編譯python3版pjsua庫(kù)的問題

    pjsua默認(rèn)綁定的python版本是python 2.4,使用起來(lái)有諸多限制,希望可以使用python3調(diào)用pjsua的庫(kù)實(shí)現(xiàn)軟電話的基礎(chǔ)功能。這篇文章主要介紹了windos10環(huán)境下編譯python3版pjsua庫(kù),需要的朋友可以參考下
    2021-10-10
  • python實(shí)現(xiàn)三子棋游戲

    python實(shí)現(xiàn)三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • python獲取服務(wù)器響應(yīng)cookie的實(shí)例

    python獲取服務(wù)器響應(yīng)cookie的實(shí)例

    今天小編就為大家分享一篇python獲取服務(wù)器響應(yīng)cookie的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-12-12
  • Python使用xlrd讀取Excel格式文件的方法

    Python使用xlrd讀取Excel格式文件的方法

    這篇文章主要介紹了Python使用xlrd讀取Excel格式文件的方法,實(shí)例分析了Python操作Excel文件的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • python進(jìn)階collections標(biāo)準(zhǔn)庫(kù)使用示例詳解

    python進(jìn)階collections標(biāo)準(zhǔn)庫(kù)使用示例詳解

    這篇文章主要為大家介紹了python進(jìn)階collections標(biāo)準(zhǔn)庫(kù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Django實(shí)現(xiàn)文件上傳下載

    Django實(shí)現(xiàn)文件上傳下載

    這篇文章主要為大家詳細(xì)介紹了Django實(shí)現(xiàn)文件上傳下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Python 中 sorted 如何自定義比較邏輯

    Python 中 sorted 如何自定義比較邏輯

    這篇文章主要介紹了Python中sorted如何自定義比較邏輯,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-02-02
  • python兩個(gè)_多個(gè)字典合并相加的實(shí)例代碼

    python兩個(gè)_多個(gè)字典合并相加的實(shí)例代碼

    這篇文章主要介紹了python兩個(gè)_多個(gè)字典合并相加,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 使用Python計(jì)算偏導(dǎo)數(shù)

    使用Python計(jì)算偏導(dǎo)數(shù)

    偏導(dǎo)數(shù)在數(shù)學(xué)、物理、工程等領(lǐng)域中都有廣泛的應(yīng)用,特別是在描述多變量系統(tǒng)的變化率、梯度、最小值和最大值等方面,下面我們就來(lái)看看如何利用Python計(jì)算偏導(dǎo)數(shù)吧
    2024-01-01

最新評(píng)論