面向對象(4)--繼承和多態
阿新 • • 發佈:2018-05-28
覆蓋 func 對象 value -- eval 一個人 pass n)
一、繼承
繼承的類稱為子類,被繼承的類稱為基類,父類,或超類。
繼承的優點:
- 簡化了代碼
- 提高了代碼的健壯性
- 提高了代碼的安全性
- 多態的前提
缺點:耦合與內聚。耦合性越低,內聚性越高,代碼越好。
比如,有一個Animal類,有個run方法:
In [1]: class Animal: ...: def run(self): ...: print(‘我正在跑步!!!‘) ...:
當我們需要創建Dog和Cat類時,可以直接繼承Animal:
In [3]: class Dog(Animal): ...:pass ...: In [4]: class Cat(Animal): ...: pass
由於Animal有run方法,通過繼承,Dog和Cat也自動擁有了run方法。
In [5]: dog=Dog() In [6]: dog.run() 我正在跑步!!! In [7]: xjm=Cat() In [8]: xjm.run() 我正在跑步!!!
在·此時你有沒有想過,每個動物的run方法都不一樣,有飛的,有遊的。有跳的,有爬的。
所以我們可以對子類的方法進行重寫,而重寫後,子類的run方法會覆蓋父類的run方法。這樣就體現了繼承的一個好處:多態。繼承正是多態的前提。
In [9]: class Cat(Animal): ...: def run(self): ...: print(‘xjm正在爬呀爬呀!!!‘) ...: In [10]: xjm=Cat() In [11]: xjm.run() xjm正在爬呀爬呀!!!
二、多繼承
每個孩子都有自己爸爸媽媽,類是否一樣呢?多繼承:
首先創建一個Father類:
In [18]: class Father(): ...: def __init__(self,money): ...: self.money=money ...: def play(self): ...: print(‘我很皮‘) ...: def func(self): ...: print(‘父親的方法‘)
再創建一個Mother類:
In [19]: class Mother(): ...: def __init__(self,faceValue): ...: self.faceValue=faceValue ...: def eat(self): ...: print(‘我是吃貨‘) ...: def func(self): ...: print(‘母親的方法‘)
先來滿足這樣一個需求,孩子繼承Father的錢money。繼承Mother的顏值faceValue
再來創建子類來繼承Father和Mother:
In [21]: class Child(Father,Mother): ...: def __init__(self,money,faceValue): ...: Father.__init__(self,money) ...: Mother.__init__(self,faceValue)
最後來實現一下:
In [23]: c=Child(30000,99) In [24]: c.money Out[24]: 30000 In [25]: c.faceValue Out[25]: 99 In [26]: c.play() 我很皮 In [27]: c.eat() 我是吃貨 In [28]: c.func() 父親的方法
說明:父類中方法名相同,默認調用的是括號中排前面的父類中的方法。
三、多態
概念:一種事物的多種形態
要理解什麽是多態,我們首先要對數據類型再作一點說明。當我們定義一個class的時候,我們實際上就定義了一種數據類型。我們定義的數據類型和Python自帶的數據類型,比如str、list、dict沒什麽兩樣:
In [12]: a=list() In [13]: b=Animal() In [14]: c=Cat() In [15]: isinstance(a,list) Out[15]: True In [16]: isinstance(c,Cat) Out[16]: True In [17]: isinstance(c,Animal) Out[17]: True
從上面代碼可以看出,c對象既屬於Cat類,又屬於Animal類。
那麽多態有什麽好處呢?通過一下一個事例來一一說明:
class Person(): def __init__(self,name,gender): self.name=name self.gender=gender def who(self): print(‘我是一個人,我的名字是%s‘%self.name) class Student(Person): def __init__(self,name,gender,score): super(Student,self).__init__(name,gender) self.score=score def who(self): print(‘我是一名學生,我的名字是%s‘%self.name) class Teacher(Person): def __init__(self,name,gender,course): super(Teacher,self).__init__(name,gender) self.course=course def who(self): print(‘我是一名老師,我的名字是%s‘%self.name) def who(x): x.who() a=Person(‘小狗‘,‘女‘) b=Student(‘小貓‘,‘男‘,99) c=Teacher(‘小雞‘,‘不男不女‘,‘python‘) who(a) who(b) who(c)
我是一個人,我的名字是小狗
我是一名學生,我的名字是小貓
我是一名老師,我的名字是小雞
面向對象(4)--繼承和多態