1. 程式人生 > >多繼承,多型

多繼承,多型

. 多繼承
在這裡插入圖片描述
從圖中能夠看出,所謂多繼承,即子類有多個父類,並且具有它們的特徵

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)