Python物件導向2:繼承、多態特徵,python多態
物件導向的第二個特徵是繼承。
可以將多個類共有的方法提取到父類中,子類僅需繼承父類;
基本文法為class新類名(父類1,父類2,..)
單繼承與多繼承區別:
Python同時支援單繼承與多繼承,當只有一個父類時為單繼承,當存在多個父類時為多繼承。
繼承的性質特徵:
子類會繼承父類的所有的屬性和方法,子類也可以覆蓋父類同名的變數和方法。
調用方法執行順序:(見案例)
在調用方法時,先調用子類自己的方法,子類無,再去父類中尋找。尋找順序是自左(從上往下)向右。
如果多個父類,再無共同的父類,則自左執行到頂,再往右執行。
如果有共同的父類,則自左執行到倒數第二層,再向右執行,最後再執行最頂層。
案例1:
F2繼承F1:類似於把F1中的功能在F2中又寫了一遍,如果有一個方法F2自己無,則去父類F1中去找找看
class F1:#父類,基類
def show(self):
print('show')
def foo(self):
print(self.name)
class F2(F1):#把F1的方法再次引用到F2;子類、衍生類別
def __init__(self,name):
self.name=name
def bar(self):
print('bar')
def show(self):
print('F2.show')
obj=F2('hh')
print('-----foo方法執行結果--------')
obj.foo()#執行結果:hh,需要去父類裡面找
print('-----show方法執行結果--------')
obj.show()#執行結果F2.show,優先執行自己的方法,再執行父類的方法
執行結果:
案例2:如果父類和子類有相同的方法,則優先執行子類自己的方法,如果子類無再去父類找
#self一直代表的是對象自己
# 如果一個方法,自己有,則執行自己的方法,如果自己沒有,再去往上去父類尋找
class S1:
def F1(self):
self.F2()
def F2(self):
print('S1.F2')
class S2(S1):
def F3(self):
self.F1()
def F2(self):
print('S2.F2')
print('----S1.F2-------------')
#執行個體化s1
obj1 = S1()
obj1.F1() # 先去S1執行F1,再看S1中有沒有F2,有,則執行自己的F2
print('----S2.F3-------------')
#執行個體化s2
obj2=S2()
#1)先去s2執行F3,因為s2自己無F1,去S1中執行F1,F1方法需要執行F2
#2)self代表s2本身,因s2自己有F2,再執行S2的F2
obj2.F3()
執行結果:
案例3:多繼承,無共同的父類,執行順序:從左(先往上)再往右。
左右類無共同父類封頂的繼承及執行的順序:
#先左,在左上,左上找到頂層,則再往右邊的類找
class c0:
def f2(self):
print('c0.f2')
class c1(c0):
def f1(self):
print('c1.f1')
class c2:
def f2(self):
print('c2.f2')
def f4(self):
print('c2.f4')
class c3(c1,c2):
def f3(self):
pass
obj=c3()#執行個體化c3對象
print('------c3.f2-------')
obj.f2()#先去找c3,c3無f2,再去c1,c1無f2,則去c0找
print('------c3.f1-------')
obj.f1()#先去找c3,c3無f1,再去c1
print('------c3.f4-------')
obj.f4()#先去找c3,c3無f4,再去c1,c1無f4,則去c0找,c0無f4,再去c2
執行結果:
案例4:多繼承,有共同的父類,執行到倒數第二層,再向右執行
#找到倒數第二層停止,再往後找,最後找共同
class c0:
def f4(self):
print('c0.f2')
class c_2(c0):
def f2(self):
print('c_2.f2')
class c21(c_2):
def f1(self):
print('c21.f1')
class c_1(c0):
def f1(self):
print('c_1.f2')
class c11(c_1):
def f1(self):
print('c11.f1')
class c3(c11,c21):
def f3(self):
print('c3.f3')
#執行個體化對象
obj=c3()
obj.f3()#依次找尋c3找到,執行結果c3.f3
obj.f1()#依次找尋c3,c11找到,執行結果c11.f1
obj.f2()#依次找尋c3,c11,c_1,c21,c_2,找到,執行結果c_2.f2
obj.f4()#依次找尋c3,c11,c_1,c21,c_2,c0找到,執行結果,c0.f2
執行順序:
物件導向的第三個特徵是多態:指參數的“有多種形式”、多種形態,意味著就算不知道變數所引用的對象類是什麼,還是能對它進行操作,而它也會根據對象(或類)類型的不同而表現出不同的行為。
其他程式設計語言如java在定義參數時,需要制定參數類型,且傳入參數時,需要符合類型要求。但python基本上不用管這個特徵,因為python定義變數時,可以不指定類型。如下案例,可以傳入不同的參數類型,比如字典、列表、數字、string等。
比如案例:
def func(arg):
print(arg)
func(1)
func("hh")
func(["a","b",6])
func({"a":1,"c":2})
案例連結:https://pan.baidu.com/s/1skU53lV 密碼:ifah
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。