python之旅:物件導向之繼承與派生

來源:互聯網
上載者:User

標籤:預設   資料   str   解決   idt   概念   something   方式   closed   

一 初識繼承 

編寫類時,並非總要從空白開始。如果你要編寫的類正好是另一個現成類的特殊版本,可使用繼承來減少代碼冗餘,子類會“遺傳”父類的屬性,從而解決代碼重用問題

什麼是繼承

繼承是一種建立新類的方式,建立的類可以繼承一個或多個父類(python支援多繼承),父類又可稱為基類或超類,建立的類稱為衍生類別或子類。

一個類繼承另一個類時,他將自動獲得另一個類的所有屬性和方法;原有的類稱為父類,而新類稱為子類。子類繼承了其父類的所有屬性和方法,同時還可以定義自己的屬性和方法。

python中類的繼承分為:單繼承和多繼承

class ParentClass1: #定義父類    passclass ParentClass2: #定義父類    passclass SubClass1(ParentClass1): #單繼承,基類是ParentClass1,衍生類別是SubClass    passclass SubClass2(ParentClass1,ParentClass2): #python支援多繼承,用逗號分隔開多個繼承的類    pass

 

查看繼承

>>> SubClass1.__bases__ #__base__只查看從左至右繼承的第一個子類,__bases__則是查看所有繼承的父類(<class ‘__main__.ParentClass1‘>,)>>> SubClass2.__bases__(<class ‘__main__.ParentClass1‘>, <class ‘__main__.ParentClass2‘>)

經典類與新式類

1.只有在python2中才分新式類和經典類,python3中統一都是新式類2.在python2中,沒有顯式的繼承object類的類,以及該類的子類,都是經典類3.在python2中,顯式地聲明繼承object的類,以及該類的子類,都是新式類3.在python3中,無論是否繼承object,都預設繼承object,即python3中所有類均為新式類#關於新式類與經典類的區別,我們稍後討論

提示:如果沒有指定基類,python的類會預設繼承object類,object是所有python類的基類,它提供了一些常見方法(如__str__)的實現。

>>> ParentClass1.__bases__(<class ‘object‘>,)>>> ParentClass2.__bases__(<class ‘object‘>,)
二 繼承與抽象(先抽象再繼承)

繼承描述的是子類與父類之間的關係,是一種什麼是什麼的關係。要找出這種關係,必須先抽象再繼承

抽象即抽取類似或者說比較像的部分。

抽象分成兩個層次: 

1.將奧巴馬和梅西這倆對象比較像的部分抽取成類; 

2.將人,豬,狗這三個類比較像的部分抽取成父類。

抽象最主要的作用是劃分類別(可以隔離關注點,降低複雜度)

 

繼承:是基於抽象的結果,通過程式設計語言去實現它,肯定是先經曆抽象這個過程,才能通過繼承的方式去表達出抽象的結構。

抽象只是分析和設計的過程中,一個動作或者說一種技巧,通過抽象可以得到類

三 繼承與重用性
==========================第一部分例如  貓可以:喵喵叫、吃、喝、拉、撒  狗可以:汪汪叫、吃、喝、拉、撒如果我們要分別為貓和狗建立一個類,那麼就需要為 貓 和 狗 實現他們所有的功能,虛擬碼如下: #貓和狗有大量相同的內容class 貓:    def 喵喵叫(self):        print ‘喵喵叫‘    def 吃(self):        # do something    def 喝(self):        # do something    def 拉(self):        # do something    def 撒(self):        # do somethingclass 狗:    def 汪汪叫(self):        print ‘喵喵叫‘    def 吃(self):        # do something    def 喝(self):        # do something    def 拉(self):        # do something    def 撒(self):        # do something==========================第二部分上述代碼不難看出,吃、喝、拉、撒是貓和狗都具有的功能,而我們卻分別的貓和狗的類中編寫了兩次。如果使用 繼承 的思想,如下實現:  動物:吃、喝、拉、撒     貓:喵喵叫(貓繼承動物的功能)     狗:汪汪叫(狗繼承動物的功能)虛擬碼如下:class 動物:    def 吃(self):        # do something    def 喝(self):        # do something    def 拉(self):        # do something    def 撒(self):        # do something# 在類後面括弧中寫入另外一個類名,表示當前類繼承另外一個類class 貓(動物):    def 喵喵叫(self):        print ‘喵喵叫‘        # 在類後面括弧中寫入另外一個類名,表示當前類繼承另外一個類class 狗(動物):    def 汪汪叫(self):        print ‘喵喵叫‘==========================第三部分#繼承的代碼實現class Animal:    def eat(self):        print("%s 吃 " %self.name)    def drink(self):        print ("%s 喝 " %self.name)    def shit(self):        print ("%s 拉 " %self.name)    def pee(self):        print ("%s 撒 " %self.name)class Cat(Animal):    def __init__(self, name):        self.name = name        self.breed = ‘貓‘    def cry(self):        print(‘喵喵叫‘)class Dog(Animal):    def __init__(self, name):        self.name = name        self.breed=‘狗‘    def cry(self):        print(‘汪汪叫‘)# ######### 執行 #########c1 = Cat(‘小白家的小黑貓‘)c1.eat()c2 = Cat(‘小黑的小白貓‘)c2.drink()d1 = Dog(‘胖子家的小瘦狗‘)d1.eat()使用繼承來重用代碼比較好的例子
使用繼承來重用代碼比較好的例子

 

在開發程式的過程中,如果我們定義了一個類A,然後又想建立立另外一個類B,但是類B的大部分內容與類A的相同時

我們不可能從頭開始寫一個類B,這就用到了類的繼承的概念。

通過繼承的方式建立類B,讓B繼承A,B會‘遺傳’A的所有屬性(資料屬性和函數屬性),實現代碼重用

class Hero:    def __init__(self,nickname,aggressivity,life_value):        self.nickname=nickname        self.aggressivity=aggressivity        self.life_value=life_value    def move_forward(self):        print(‘%s move forward‘ %self.nickname)    def move_backward(self):        print(‘%s move backward‘ %self.nickname)    def move_left(self):        print(‘%s move forward‘ %self.nickname)    def move_right(self):        print(‘%s move forward‘ %self.nickname)    def attack(self,enemy):        enemy.life_value-=self.aggressivityclass Garen(Hero):    passclass Riven(Hero):    passg1=Garen(‘草叢倫‘,100,300)r1=Riven(‘銳雯雯‘,57,200)print(g1.life_value)r1.attack(g1)print(g1.life_value)‘‘‘運行結果300243‘‘‘
View Code

 

提示:用已經有的類建立一個新的類,這樣就重用了已經有的軟體中的一部分設定大部分,大大生了編程工作量,這就是常說的軟體重用,不僅可以重用自己的類,也可以繼承別人的,比如標準庫,來定製新的資料類型,這樣就是大大縮短了軟體開發週期,對大型軟體開發來說,意義重大.

注意:像g1.life_value之類的屬性引用,會先從執行個體中找life_value然後去類中找,然後再去父類中找...直到最頂級的父類。

四 派生

重點!!!:再看屬性尋找

#繼承:子類可以遺傳父類的一些代碼#派生:子類可以定義自己專屬的代碼,覆蓋掉父類的代碼class Foo:    def f1(self):        print(‘Foo.f1‘)    def f2(self):        print(‘Foo.f2‘)        self.f1()class Bar(Foo):    def f1(self):        print(‘Foo.f1‘)b=Bar()b.f2()#一定是按照這順序去找:先去自己的名稱空間找f2--》沒有在去自己的類--》沒有再去父類去找#一定是按照這順序去找:先去自己的名稱空間找f2--》沒有在去自己的類--》沒有再去父類去找,所以此處為Bar類的f1  ###這就是派生#結果Foo.f2Foo.f1

 

當然子類也可以添加自己新的屬性或者在自己這裡重新定義這些屬性(不會影響到父類),需要注意的是,一旦重新定義了自己的屬性且與父類重名,那麼調用新增的屬性時,就以自己為準了。

 

python之旅:物件導向之繼承與派生

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.