婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳細總結Python類的多繼承知識

詳細總結Python類的多繼承知識

熱門標簽:陜西金融外呼系統 哈爾濱ai外呼系統定制 廣告地圖標注app 公司電話機器人 騰訊外呼線路 海南400電話如何申請 激戰2地圖標注 唐山智能外呼系統一般多少錢 白銀外呼系統

一、Python不同版本的類

  • Python2.2之前是沒有共同的祖先的,之后引入Object類,它是所有類的共同祖先類Object
  • Python2中為了兼容,分為古典類(舊式類)和新式類
  • Python3中全部都是新式類
  • 新式類都是繼承自Object的,新式類可以使用super
#古典類在python2.x中運行
class A: pass
 
print(dir(A))            #    ['__doc__', '__module__']
print(A.__bases__)        #    ()
a = A()    
print(a.__class__)        #     __main__.A   
print(type(a))            #    type 'instance'>

新式類

#新式類在python3.x中運行
class B: pass
 
print(dir(B))   #   ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
print(B.__bases__)  #   (class 'object'>,)
B = B()
print(B.__class__)  #   class '__main__.B'>
print(type(B))      #   class '__main__.B'>

二、多繼承

OCP原則:多用”繼承“,少修改

繼承的用途:增強基類,實現多態

多態

  • 在面向對象中,父類、子類通過繼承聯系在一起,如果可以通過一套方法,就可以實現不同變現,就是多態
  • 一個類繼承自多個類就是多繼承它將具有多個類的特征

三、多繼承弊端

多繼承很好的模擬了世界,因為事務很少單一繼承,但是舍棄簡單,必然引入復雜性,帶來了沖突

如同一個孩子繼承了來自父母雙方的特征,那么到底眼睛像爸爸還是媽媽尼?孩子究竟改像誰多一點尼?

多繼承的實現會導致編譯器設計的復雜度增加,所以現在很多語言舍棄了類的多繼承

C++支持多繼承;Java舍棄了多繼承

  • Java中,一個類可以實現多個接口,一個接口也可以繼承多個接口。Java的接口很純粹,只是方法聲明,繼承者必須實現這些方法,就具有了這些能力,就能干什么

多繼承可能會帶來二義性,例如,貓和狗都繼承自動物類,現在一個類多繼承了貓和狗類,貓和狗都有了shout方法,子類究竟繼承誰的shout尼?

  • 解決方案:實現了多繼承的語言,要解決二義性,深度優先或者廣度優先

四、Python多繼承實現

class ClassName(基類列表):
    類體

多繼承帶來的路徑選擇問題,究竟繼承那個父類的特征尼?

  • 究竟先廣度優先,還是深度優先

Python使用MRO(method resolution order) 解決類搜索順序問題。

  • 經典算法,按照定義從左到右,深度優先策略【比如Python2.2之前,左圖的MRO算法,MyClass→D→B→A→C→A】
  • 新式類算法,經典算法的升級,重復的只保留最后一個。【左圖MRO是:MyClass→D→B→C→A→object】
  • C3算法,在類被創建出來的時候,就計算除一個MRO有序列表。【Python3唯一支持的算法,左圖中MRO是MyClass→D→B→C→A→object】C3過于復雜,沒必要去記,我們只要記住【object.mro(),顯示繼承的方法,從左到右依次查找】

五、多繼承的缺點

當類很多,繼承復雜的情況下,繼承路徑太多,很難說清什么樣的繼承路徑

團隊協作開發,如果引入多繼承,那代碼將不可控

不管編程語言是否支持多繼承,都應當避免多繼承

Pythond的面向對象,我們看到太靈活,太開放,所以要團隊守規矩

六、Mixin 

類有下面的繼承關系

文檔Document類是其他所有文檔類的抽象基類,Word、Pdf類是Document的子類

需求:為Document子類提供打印能力思路:

1、在Document中提供print方法

class Document:
 
    def __init__(self,content):
        self.coutent = content
 
    def print(self):
        print(self.coutent)
 
class Word(Document): pass
 
class Pdf(Document):  pass
 
a = Word("tom com")
a.print()   #   tom com

基類提供的方法不因該具體實現,因為它未必適合子類的打印,子類中需要覆蓋重寫。

print算是一種能力 -- 打印功能,不是所有的Document的子類都需要的,所以,從這個角度出發有點問題

class Document:
 
    def __init__(self,content):
        self.coutent = content
 
    def print(self):
        print(self.coutent)
 
class Word(Document):
    def print(self):
        print("Word print {}".format(self.coutent))
 
class Pdf(Document):  pass
 
a = Word("tom com")
a.print()   #   Word print tom com

思路二:需要打印的子類上增加

如果現有子類上直接增加,違反了OCP的原則,所以應該繼承后增加

class Document:        # 不允許修改
    def __init__(self,content):
        self.coutent = content
 
    def print(self):
        print(self.coutent)
 
class Word(Document): pass    # 不允許修改
 
class Pdf(Document):  pass    #    不允許修改
 
class PrinttableWord(Word):    
    def print(self):
        print("PrinttableWord print {}".format(self.coutent))
 
print(PrinttableWord.mro()) #   [class '__main__.PrinttableWord'>, class '__main__.Word'>, class '__main__.Document'>, class 'object'>]
a = PrinttableWord("tom com")
a.print()   #   PrinttableWord print tom com

看似不錯,如果還要提供其他類似能力,如何繼承?

應用于網絡,文檔應該具備序列化的能力,類上就應該實現序列化可序列化還可能分為使用pickle、josn、messagepack等

這個時候,發現,類又可能太多了,繼承的方式不是很好了

功能太多,A類需要某幾樣功能,B類需要另外幾樣功能,很繁瑣

思路三:裝飾器,用裝飾器增強一個類,把功能給類附加上去,那個類需要,就裝飾它

def printable(cls):
    def _print(self):
        print("_print 裝飾器 {}".format(self.coutent))
        return _print
    cls.print = _print
    return cls
 
class Document:
    def __init__(self,content):
        self.coutent = content
 
    def print(self):
        print(self.coutent)
 
class Word(Document): pass
 
class Pdf(Document):  pass
 
@printable
class PrinttableWord(Word): pass    #先繼承,后裝飾
 
 
print(PrinttableWord.__dict__)  #   {'__module__': '__main__', '__doc__': None, 'print': function printable.locals>._print at 0x0173C228>}
a = PrinttableWord("tom")
a.print()   #   _print 裝飾器 tom

優點:簡單方便,在需要的地方動態增加

思路四:Mixin  【用類去繼承】

先看代碼

class PrintableMixin:
    def print(self):
        print("PrintableMixin {}".format(self.coutent))
 
class Document:
    def __init__(self,content):
        self.coutent = content
 
    def print(self):
        print(self.coutent)
 
class Word(Document): pass
 
class Pdf(Document):  pass
 
 
class PrinttableWord(PrintableMixin,Word): pass    
 
print(PrinttableWord.mro())     #   [class '__main__.PrinttableWord'>, class '__main__.PrintableMixin'>, class '__main__.Word'>, class '__main__.Document'>, class 'object'>]
print(PrinttableWord.__dict__)  #   {'__module__': '__main__', '__doc__': None}
a = PrinttableWord("tom")
a.print()   #   PrintableMixin tom

Mixin就是其他類混合進來,同時帶來了類的屬性和方法

這里看來Mixin類和裝飾器效果一樣,也什么特別的,但是Mixin是類,就可以繼承,增強功能

class PrintableMixin:
    def print(self):
        print("PrintableMixin {}".format(self.coutent))
 
class Document:
    def __init__(self,content):
        self.coutent = content
 
    def print(self):
        print(self.coutent)
 
class Word(Document): pass
 
class Pdf(Document):  pass
 
 
class PrinttableWord(PrintableMixin,Word): pass
 
class SuperPrintableMixin(PrintableMixin,Word):
    def print(self):
        print("~"*30)
        super(SuperPrintableMixin, self).print()
        print("~"*30)
 
print(SuperPrintableMixin.mro())     #  [class '__main__.SuperPrintableMixin'>, class '__main__.PrintableMixin'>, class '__main__.Word'>, class '__main__.Document'>, class 'object'>]
print(SuperPrintableMixin.__dict__)  #  {'__module__': '__main__', 'print': function SuperPrintableMixin.print at 0x018264B0>, '__doc__': None}
a = SuperPrintableMixin("tom")
a.print()   #   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   PrintableMixin tom
            #   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

七、Mixin類

Minxin本質上就是多繼承實現的

Mixin體現的是一種組合的設計模式

在面向對象的設計中,一個負載的類,往往需要很多功能,而這些功能有來自不同的類提供,這就需要很多的類組合在一起

從設計模式的角度來說,多組合,少繼承。

  • Mixin類的使用原則
  • Mixin類中不應該顯示的出現__init__初始化方法
  • Mixin類通常不能獨立工作,因為它是準備混入別的類中的部分功能實現
  • Mixin類的祖先類也應該是Mixin類
  • 使用時,Mixin類通常在繼承列表第一個位置,例如:class PrintableWord(PrintableMixin,Word):pass

到此這篇關于總結Python類的多繼承知識的文章就介紹到這了,更多相關Python類的多繼承內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python支持多繼承嗎
  • Python多繼承以及MRO順序的使用
  • python多繼承(鉆石繼承)問題和解決方法簡單示例
  • 在python里面運用多繼承方法詳解
  • Python面向對象程序設計多繼承和多態用法示例
  • Python多繼承原理與用法示例
  • Python面向對象程序設計之繼承與多繼承用法分析
  • Python多繼承順序實例分析
  • Python中的單繼承與多繼承實例分析
  • Python 多繼承中的一個詭異現象 既是 Father又是grandfather

標簽:黔西 常德 四川 益陽 上海 惠州 黑龍江 鷹潭

巨人網絡通訊聲明:本文標題《詳細總結Python類的多繼承知識》,本文關鍵詞  詳細,總結,Python,類,的,多,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳細總結Python類的多繼承知識》相關的同類信息!
  • 本頁收集關于詳細總結Python類的多繼承知識的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久99精品一区二区三区三区| 亚洲卡通欧美制服中文| 国产精品灌醉下药二区| 在线日韩av片| 成人一区二区三区中文字幕| 午夜久久久影院| 欧美喷潮久久久xxxxx| 日韩中文字幕亚洲一区二区va在线 | 国产精品美女久久久久aⅴ国产馆| 国产一区二区三区黄视频 | 国产中文字幕一区| 精品乱码亚洲一区二区不卡| 777久久久精品| 日韩国产欧美视频| 一区二区日韩av| 制服丝袜亚洲色图| 久久99国产精品久久| 亚洲影院在线观看| 欧美成人乱码一区二区三区| 成人在线一区二区三区| 亚洲欧美日韩一区| 亚洲丝袜另类动漫二区| 欧美亚日韩国产aⅴ精品中极品| 91污片在线观看| 成人黄色大片在线观看| 国产精品久久久久久久午夜片| 欧美成人a在线| 97久久超碰国产精品电影| 国产福利精品一区二区| 国产精品成人一区二区三区夜夜夜| 久久久91精品国产一区二区精品| jiyouzz国产精品久久| 一区二区在线免费| 精品国产免费人成电影在线观看四季 | 日韩av不卡一区二区| 亚洲精品一线二线三线| 91精品国产欧美一区二区18| 高清国产午夜精品久久久久久| 国产成人精品网址| 亚洲午夜久久久久久久久电影网 | 色综合天天天天做夜夜夜夜做| 午夜影院久久久| 日韩精品91亚洲二区在线观看| 久久综合久久综合久久| 久久精品人人做人人爽人人| 国产精品综合一区二区| 国产老肥熟一区二区三区| 国产精品自拍三区| 午夜精品视频在线观看| 秋霞国产午夜精品免费视频| 国产精品电影院| 亚洲永久免费视频| 国产欧美一区视频| 综合色中文字幕| 一区二区三区蜜桃网| 久久久久久久久岛国免费| 中文字幕不卡三区| 欧美一卡2卡三卡4卡5免费| www日韩大片| 欧美日韩免费不卡视频一区二区三区| 777xxx欧美| 风间由美一区二区三区在线观看 | 亚洲高清不卡在线| 国产麻豆精品在线| 9191成人精品久久| 久久亚洲私人国产精品va媚药| 精品日韩99亚洲| 国产日韩视频一区二区三区| 欧美日韩不卡在线| 欧美日韩国产综合视频在线观看 | 欧美成人艳星乳罩| 国产不卡一区视频| 欧美性xxxxxxxx| 精品成人一区二区三区| 欧美日韩国产综合久久| 久久久精品天堂| 日韩精品一区二区三区视频在线观看| 欧美国产丝袜视频| 另类小说欧美激情| 成年人国产精品| 欧美日韩一级大片网址| 国内精品自线一区二区三区视频| 亚洲成人手机在线| 国产99久久久国产精品潘金网站| 欧美午夜精品久久久久久孕妇 | 国产在线不卡视频| 日本色综合中文字幕| 成人福利电影精品一区二区在线观看| 国产精品理伦片| 日韩av中文在线观看| av在线播放不卡| www.激情成人| 欧美一级久久久久久久大片| 91精品国产一区二区人妖| 中文字幕一区二区三| 国产精品成人网| 欧美电影免费观看高清完整版在线观看 | 99精品视频一区| 欧美一区二区在线免费播放| 欧美日韩mp4| 国产精品美女久久久久aⅴ| 国产欧美精品区一区二区三区| 日本午夜一区二区| 亚洲一区二区精品3399| 成人免费毛片aaaaa**| 欧美一级生活片| 久久综合久久综合久久| 午夜精品久久久久| 日本va欧美va精品| 欧美日韩中文精品| 色88888久久久久久影院按摩 | 国产精品国产三级国产aⅴ无密码| 日本一区二区三区四区| 久88久久88久久久| 午夜一区二区三区在线观看| 99re这里只有精品首页| 国产三级欧美三级| 亚洲欧美另类图片小说| 成人蜜臀av电影| 91国内精品野花午夜精品| 中文字幕欧美日本乱码一线二线| 韩国精品在线观看| 欧美人与z0zoxxxx视频| 一区二区视频在线看| 婷婷夜色潮精品综合在线| 欧美三区在线观看| 欧美一区二区大片| 奇米精品一区二区三区在线观看| 欧美电视剧在线看免费| 一区二区三区美女| k8久久久一区二区三区 | 亚洲一区二区视频在线| 一区二区三区在线免费播放| 色久综合一二码| 亚洲女子a中天字幕| 六月丁香婷婷色狠狠久久| 日韩丝袜美女视频| 国产精品国产馆在线真实露脸| 成人h动漫精品一区二区| 中文天堂在线一区| 日本不卡视频在线观看| 日韩欧美国产麻豆| 亚洲视频在线观看一区| 91影视在线播放| 欧美日韩一区三区四区| 国产精品久久精品日日| 国产成人在线观看| 欧美日韩国产首页| 美日韩一级片在线观看| 五月天亚洲婷婷| 色综合久久久久| 国产亚洲制服色| 日韩精彩视频在线观看| 日韩美女主播在线视频一区二区三区 | 日韩国产高清在线| 日韩精品一区二区三区老鸭窝| 日韩精品一区二区三区swag | 香港成人在线视频| 亚洲美女免费在线| 欧美巨大另类极品videosbest | 欧美另类z0zxhd电影| 日韩免费视频一区二区| 国产成人午夜电影网| 国产精品国产三级国产aⅴ原创 | 久久一二三国产| 成人性视频网站| 欧美电影影音先锋| 国产伦理精品不卡| 中文字幕日韩一区| 国产乱码精品一区二区三| 中文字幕一区二区三区蜜月| 狠狠色丁香婷综合久久| 国产精品二区一区二区aⅴ污介绍| 久久精品水蜜桃av综合天堂| 日韩成人免费电影| 91高清视频在线| 中文字幕日韩欧美一区二区三区| 亚洲mv大片欧洲mv大片精品| 精品久久久久一区二区国产| 午夜视频一区二区三区| 色香蕉成人二区免费| 国产精品色一区二区三区| 精品sm在线观看| 国产日韩欧美综合在线| 成人国产亚洲欧美成人综合网| 久久久久久久久久久久久女国产乱| 麻豆高清免费国产一区| 欧美一区二区三区视频在线观看| 欧美精品黑人性xxxx| 日韩美女啊v在线免费观看| 国产成人在线观看| 3d成人动漫网站| 美洲天堂一区二卡三卡四卡视频| 亚洲婷婷综合久久一本伊一区| 国产91精品免费| 日本麻豆一区二区三区视频| 国产精品青草久久| 93久久精品日日躁夜夜躁欧美| 久草在线在线精品观看| 欧美做爰猛烈大尺度电影无法无天|