python_単一継承とマルチ継承

9106 ワード

単一継承とマルチ継承?
≪単一継承|Single Inheritance|emdw≫:1つのクラスで1つの親のみを継承できる方法.≪マルチ継承|Multi Inheritance|emdw≫:1つのクラスが複数の親を継承する方法.
単一継承:(生物角度)ヒト->哺乳類->動物->生物->有機物...
マルチ継承:(社会的観点)
    (   )           (  )      (  )    (    )

     (  ,  ,  ,    )

シングル継承ケース:親:pass
  (  ):
    pass

マルチ継承例:親1:pass親2:pass親3:pass
  (  1,  2,  3):
    pass

多重継承の問題点:菱形継承またはダイヤモンド継承の問題.菱形bug:継承でメソッドが複数回呼び出されます!
菱形継承のバグ解決:MROリストとsuperクラス
    :                 

                ,           MRO  。

MRO  : Method Realtion Order        。

MRO        :1.            2.      ,            

super()     ,      ,    super   MRO       

super()                ,    

issubclass(  ,  ) :               

      mro  ,      .mro()        .__mro__   

#                 
#    :          
#    :          

#     (   )
class GrandFather():
    money = 10000000

class Father(GrandFather):
    money = 1000
    face = "      "

class Me(Father):
    pass
#    
myself = Me()
print(myself.money)
print(myself.face)


#    (    )
class Python():
    def luoji(self):
        print("          ")
class Spider():
    def paqu(self):
        print("                   ")
class Think():
    def fenxi(self):
        print("                   ")
class MySelf(Think,Spider,Python):
    pass
me = MySelf()
me.luoji()
me.paqu()
me.fenxi()


#       BUG-    
class Human():
    def say(self):
        print("      :    !")
class Man(Human):
    def say(self):
        super().say()
        print("      :        ~")
class WoMan(Human):
    def say(self):
        super().say()
        print("      :             ")
class Child(Man,WoMan):
    def say(self):
        super().say()
        print("      :   ~")
#    
child = Child()
# child.say()
# mro  
print(Child.mro())

# super()        mro