Python筆記六(面向對象的三大特性)
類的三大特性:繼承 多態 封裝
1、什麽是繼承
繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可稱為基類或超類,新建的類稱為派生類或子類。
為什麽會有繼承? 解決代碼的冗余問題。
python中類的繼承分為:單繼承和多繼承
Parent類 —— 父類 基類 超類
Son類 —— 子類 派生類
class ParentClass1: #定義父類 pass class ParentClass2: #定義父類 pass class SubClass1(ParentClass1): #單繼承,基類是ParentClass1,派生類是SubClass pass class 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): pass class Person(Animal): pass egg = 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筆記六(面向對象的三大特性)