Python物件導向2:繼承、多態特徵,python多態

來源:互聯網
上載者:User

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

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.