面向物件-三大特性
阿新 • • 發佈:2018-11-21
python面向物件程式設計三大特性
小結:前面我們說完了類和物件的關係,相信對類和物件的理解更加透徹..讓我們一起去研究面向物件的三大特性吧....
繼承
1.什麼繼承?
在程式中繼承就是事物之間的所屬關係.
2.繼承的語法: 單繼承 和多繼承
#單繼承 class A:pass class B(A):pass #B類繼承了A類 A為父類,B為子類 print(B.__bases__) # __bases__ 檢視所有繼承的父類 #多繼承 class C:pass class D:pass class E(C,D):pass # E類繼承了C,D兩個類,其中C,D 都是父類,E類是子類
A類 : 父類,也稱基類/超類.
B類:子類,也成派生類
3.父類和子類的關係
1. 子類可以繼承父類的方法和屬性
常規繼承
class Animal: def __init__(self,name,kind,languge): self.name = name self.kind = kind self.languge = languge def eat(self): print('%s is eattint'%(self.name)) def drink(self): print('%s is drinking'%self.name) def yell(self): print('%s say %s'%(self.name,self.languge)) class Cat(Animal):pass class Dog(Animal):pass small_cat =Cat('small_cat','persian','mews') small_dog =Dog('small_dog','Huskil','yap') small_cat.yell() #Cat類沒有__init__方法,繼承父類中的屬性和方法,在Animal類找到init方法進行執行.small_dog.drink() print(small_dog.name)
分析例項化執行流程: 以Cat類為例
1.首先先開闢一塊記憶體空間,並且記憶體空間有一個類指標,指向Cat,
2.然後執行init方法,在Cat中並沒有init方法,於是找Animal父類中init方法
3.將空間返回給small_cat
2.如果子類也中擁有自己的屬性怎麼繼承呢?
class Animal: def __init__(self,name,kind,language): self.name = name self.kind = kind self.language = language def yell(self): print('%s say %s'%(self.name,self.language)) class Cat(Animal): #子類中擁有自己的方法 def climb(self): # 派生方法 print('%s can climb'%self.name) class Dog(Animal): # 派生方法 def lookafter_door(self): print('%s can look after door'%self.name) small_cat =Cat('small_cat','persian','mews') small_dog =Dog('small_dog','Huskil','yap') small_cat.climb() #自己有方法用自己 small_dog.lookafter_door() #同理 animal_1 = Animal('大金魚','魚','吐泡泡') animal_1.climb() # 父類呼叫子類的方法直接報錯
從中分析子類呼叫方法:1.子類有自己的方法就用自己,用了自己的就不可以用父類的
2.子類中沒有方法直接用父類的
3.子類有個性化方法,單獨定義在子類中 -->派生方法
4.子類可以呼叫父類,父類不能呼叫子類.
3.子類和父類的方法相同又都想用怎麼辦?
class Animal: def __init__(self,name,kind,language): self.name = name self.kind = kind self.language = language def sleep(self): print('%s 在睡覺'%self.name,) class Cat(Animal): def climb(self): # 派生方法 print('%s can climb'%self.name) def sleep(self): Animal.sleep(self) # 父類名,主動傳self 實現呼叫父類同名方法 #super().sleep() 當然這種 super(self,Cat).方法名() 也可以 print('團著睡') small_cat =Cat('small_cat','persian','mews') small_cat.sleep() #如果需要既執行父類方法sleep,又要執行Cat類自己方法.達到特定的效果.就需要呼叫父類了 總結:當某一個方法,父類和子類都擁有的時候,那麼在子類的方法中,呼叫父類的同名方法 1.父類名.方法名(self,...) 2.super().方法名(...)
4.為什麼有繼承?
幾個類之間有重複的屬性和方法,把相同的屬性和方法都抽象出來,作為父類,子類取繼承父類. 為了解決類與類之間程式碼重複的問題.
請看看示例程式碼:
#動物類 class Animal: def __init__(self,name,hp,ad): self.name = name self.hp = hp self.ad = ad class People(Animal): def __init__(self, name, sex, hp, ad): super().__init__(name,hp,ad) self.sex = sex def attack(self,giant): print('%s發起了攻擊了%s'%(self.name,giant.name)) giant.hp -= Sheldon.ad print('%s的HP剩餘%s' % (giant.name, giant.hp)) # #怪獸類 class Monster(Animal): def __init__(self,name,kind,hp,ad): super().__init__(name,hp,ad) self.kind = kind def bite(self,Sheldon): print('%s撕咬了%s'%(self.name,Sheldon.name)) Sheldon.hp -= giant.ad print('%s的HP剩餘%s'%(Sheldon.name,Sheldon.hp)) giant = Monster('giant','big',100,20) Sheldon = People('sheldon','male',100,10) Sheldon.attack(giant) giant.bite(Sheldon)
.....