Python筆記六(物件導向的三大特性)

來源:互聯網
上載者:User

標籤:AC   重用   需要   隔離   http   大型   python筆記   應該   多態   

類的三大特性:繼承 多態 封裝

1、什麼是繼承

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

為什麼會有繼承? 解決代碼的冗餘問題。

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

Parent類 —— 父類 基類 超類 
Son類     —— 子類 衍生類別 

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

查看繼承

#__base__只查看從左至右繼承的第一個父類,__bases__則是查看所有繼承的父類print(SubClass2.__base__)#>>><class ‘__main__.ParentClass1‘>print(SubClass1.__bases__)#>>>(<class ‘__main__.ParentClass1‘>,)print(SubClass2.__bases__)#>>>(<class ‘__main__.ParentClass1‘>, <class ‘__main__.ParentClass2‘>)#提示:如果沒有指定基類,python的類會預設繼承object類,object是所有python類的基類,它提供了一些常見方法(如__str__)的實現。ParentClass1.__bases__#>>>(<class ‘object‘>,)ParentClass2.__bases__#>>>(<class ‘object‘>,)
2、繼承與抽象(先抽象再繼承)

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

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

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

3、繼承與重用性

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

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

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

class Animal:    ‘‘‘    人和狗都是動物,所以創造一個Animal基類    ‘‘‘    def __init__(self, name, aggressivity, life_value):        self.name = name  # 人和狗都有自己的暱稱;        self.aggressivity = aggressivity  # 人和狗都有自己的攻擊力;        self.life_value = life_value  # 人和狗都有自己的生命值;    def eat(self):        print(‘%s is eating‘%self.name)class Dog(Animal):    passclass Person(Animal):    passegg = Person(‘egon‘,10,1000)ha2 = Dog(‘二愣子‘,50,1000)egg.eat()ha2.eat()

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

4、派生

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

在子類中,建立的重名的函數屬性,在編輯函數內功能的時候,有可能需要重用父類中重名的那個函數功能,應該是用調用普通函數的方式,即:類名.func(),此時就與調用普通函數無異了,因此即便是self參數也要為其傳值。

通過繼承建立了衍生類別與基類之間的關係,它是一種‘是‘的關係,比如白馬是馬,人是動物。

當類之間有很多相同的功能,提取這些共同的功能做成基類,用繼承比較好,比如教授是老師

class Animal:    def __init__(self, name, hp, dps):        self.name = name        self.hp = hp        self.dps = dps    def eat(self):        print(‘%s吃藥回血了‘%self.name)class Person(Animal):    def __init__(self, name, hp, dps,sex):        # 第一種寫法:Animal.__init__(self, name, hp, dps)        # 另一種方法如下,相當於super(Person,self).__init__(name,hp,dps),Person,self是python解譯器自動加上的        super().__init__(name,hp,dps)        self.sex = sex           # 派生屬性    def attack(self,dog):        dog.hp -= self.dps        print(‘%s打了%s,%s掉了%s點血,剩餘%s點血‘ % (self.name, dog.name, dog.name, self.dps, dog.hp))class Dog(Animal):    def __init__(self,name,hp,dps,kind):        super().__init__(name, hp, dps)        self.kind = kind         # 派生屬性    def bite(self,person):        person.hp -= self.dps        print(‘%s打了%s,%s掉了%s點血,剩餘%s點血‘ % (self.name, person.name, person.name, self.dps, person.hp))alex = Person(‘alex‘,250,5,‘N/A‘)ha2 = Dog(‘哈士奇‘,15000,200,‘藏獒‘)print(alex.__dict__)print(ha2.__dict__)ha2.eat()alex.eat()ha2.bite(alex)alex.attack(ha2)# >>>{‘name‘: ‘alex‘, ‘hp‘: 250, ‘dps‘: 5, ‘sex‘: ‘N/A‘}# >>>{‘name‘: ‘哈士奇‘, ‘hp‘: 15000, ‘dps‘: 200, ‘kind‘: ‘藏獒‘}# >>>哈士奇吃藥回血了# >>>alex吃藥回血了# >>>哈士奇打了alex,alex掉了200點血,剩餘50點血

 

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.