python_単一継承とマルチ継承
9106 ワード
単一継承とマルチ継承?
≪単一継承|Single Inheritance|emdw≫:1つのクラスで1つの親のみを継承できる方法.≪マルチ継承|Multi Inheritance|emdw≫:1つのクラスが複数の親を継承する方法.
単一継承:(生物角度)ヒト->哺乳類->動物->生物->有機物...
マルチ継承:(社会的観点)
シングル継承ケース:親:pass
マルチ継承例:親1:pass親2:pass親3:pass
多重継承の問題点:菱形継承またはダイヤモンド継承の問題.菱形bug:継承でメソッドが複数回呼び出されます!
菱形継承のバグ解決:MROリストとsuperクラス
≪単一継承|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