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

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

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

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

多繼承問(wèn)題

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è)問(wèn)題,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)文章

最新評(píng)論

阳信县| 南安市| 龙口市| 安乡县| 双牌县| 瑞丽市| 维西| 阿克陶县| 宁都县| 九龙县| 尖扎县| 桃源县| 环江| 宜都市| 新巴尔虎左旗| 太保市| 鄄城县| 大洼县| 海城市| 大余县| 龙州县| 乐山市| 柳林县| 蛟河市| 香格里拉县| 鄂伦春自治旗| 平远县| 仁化县| 嘉鱼县| 竹北市| 县级市| 泸水县| 嘉义市| 上饶市| 乌鲁木齐县| 长岛县| 辉县市| 青龙| 衡阳市| 介休市| 新巴尔虎左旗|