多繼承,多型
. 多繼承
從圖中能夠看出,所謂多繼承,即子類有多個父類,並且具有它們的特徵
Python中多繼承的格式如下:
#定義一個父類
class A:
def printA(self):
print(’----A----’)
#定義一個父類
class B:
def printB(self):
print(’----B----’)
#定義一個子類,繼承自A、B
class C(A,B):
def printC(self):
print(’----C----’)
obj_C = C()
obj_C.printA()
obj_C.printB()
執行結果:
----A----
----B----
說明
python中是可以多繼承的
父類中的方法、屬性,子類會繼承
注意點
想一想:
如果在上面的多繼承例子中,如果父類A和父類B中,有一個同名的方法,那麼通過子類去呼叫的時候,呼叫哪個?
#coding=utf-8
class base(object):
def test(self):
print(’----base test----’)
class A(base):
def test(self):
print(’----A test----’)
#定義一個父類
class B(base):
def test(self):
print(’----B test----’)
#定義一個子類,繼承自A、B
class C(A,B):
pass
obj_C = C()
obj_C.test()
print(C.mro) #可以檢視C類的物件搜尋方法時的先後順序
多型
多型的概念是應用於Java和C#這一類強型別語言中,而Python崇尚“鴨子型別”。
所謂多型:定義時的型別和執行時的型別不一樣,此時就成為多型
Python虛擬碼實現Java或C#的多型
class F1(object):
def show(self):
print ‘F1.show’
class S1(F1):
def show(self):
print ‘S1.show’
class S2(F1):
def show(self):
print ‘S2.show’
#由於在Java或C#中定義函式引數時,必須指定引數的型別
#為了讓Func函式既可以執行S1物件的show方法,又可以執行S2物件的show方法,所以,定義了一個S1和S2類的父類
#而實際傳入的引數是:S1物件和S2物件
def Func(F1 obj):
“”“Func函式需要接收一個F1型別或者F1子類的型別”""
print obj.show()
s1_obj = S1()
Func(s1_obj) # 在Func函式中傳入S1類的物件 s1_obj,執行 S1 的show方法,結果:S1.show
s2_obj = S2()
Func(s2_obj) # 在Func函式中傳入Ss類的物件 ss_obj,執行 Ss 的show方法,結果:S2.show
Python “鴨子型別”
class F1(object):
def show(self):
print ‘F1.show’
class S1(F1):
def show(self):
print 'S1.show'
class S2(F1):
def show(self):
print 'S2.show'
def Func(obj):
print obj.show()
s1_obj = S1()
Func(s1_obj)
s2_obj = S2()
Func(s2_obj)