Python面向物件之繼承(02)
Python面向物件之繼承(02)
知識框架:
1.什麼是繼承
2.繼承與抽象
3.繼承與重用性
4.繼承的更多說明
什麼是繼承
面向物件程式設計 (OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。
通過繼承建立的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”,繼承的過程,就是從一般到特殊的過程。在某些 OOP 語言中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現。
繼承概念的實現方式主要有2類:實現繼承、介面繼承。
-
實現繼承是指使用基類的屬性和方法而無需額外編碼的能力。
-
介面繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力(子類重構爹類方法)。
在考慮使用繼承時,有一點需要注意,那就是兩個類之間的關係應該是“屬於”關係。例如,Employee 是一個人,Manager 也是一個人,因此這兩個類都可以繼承 Person 類。但是 Leg 類卻不能繼承 Person 類,因為腿並不是一個人。
OO開發正規化大致為:劃分物件→抽象類→將類組織成為層次化結構(繼承和合成) →用類與例項進行設計和實現幾個階段。
python中類的繼承分為:單繼承和多繼承
#定義父類 class ParentClass1: pass #定義父類 class ParentClass2: pass #單繼承基類是ParentClass1派生類是SubClass class SubClass1(ParentClass1): pass #python支援多繼承,用逗號分隔開多個繼承的類 class SubClass2(ParentClass1,ParentClass2): pass
提示
繼承與抽象
抽象即抽取類似或者說比較像的部分。是一種歸類的方法。
繼承:是基於抽象的結果,通過程式語言去實現它,肯定是先經歷抽象這個過程,才能通過繼承的方式去表達出抽象的結構。
抽象只是分析和設計的過程中,一個動作或者說一種技巧,通過抽象可以得到類。
繼承與重用性
在開發程式的過程中,當父類的方法實現不能滿足子類需求時 可以對方法進行重寫。
1.覆蓋父類的方法
在子類中定義一個和父類同名的方法並且實現
2.對父類的方法進行擴充套件
在子類中重寫父類的方法
在需要的位置使用 super().父類方法
注意:
python2.0 中呼叫父類方法 父類名.方法(self)
python 3.0 中仍然保留 但是不推薦使用 ,一旦父類發生變化 方法呼叫位置的類名也需要修改。開發過程中,父類名和super()兩種方式不要混用,如果當前子類名呼叫方法會形成遞迴調用出現死迴圈。
class Parent: # 定義父類 def myMethod(self): print '呼叫父類方法' class Child(Parent): # 定義子類 def myMethod(self): print '呼叫子類方法' c = Child() # 子類例項 c.myMethod() # 子類呼叫重寫方法
具體案例:
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('Ahab',10,1000) ha2 = Dog('天霸',50,1000) egg.eat() ha2.eat()
繼承的更多說明
在python中繼承中的一些特點:
-
1、如果在子類中需要父類的構造方法就需要顯示的呼叫父類的構造方法,或者不重寫父類的構造方法。
-
2、在呼叫基類的方法時,需要加上基類的類名字首,且需要帶上 self 引數變數。區別在於類中呼叫普通函式時並不需要帶上 self 引數
-
3、Python 總是首先查詢對應型別的方法,如果它不能在派生類中找到對應的方法,它才開始到基類中逐個查詢。(先在本類中查詢呼叫的方法,找不到才去基類中找)。
如果在繼承元組中列了一個以上的類,那麼它就被稱作"多重繼承" 。
派生類的宣告,與他們的父類類似,繼承的基類列表跟在類名之後,如下所示:
class SubClassName (ParentClass1[, ParentClass2, ...]): ...
私有屬性和方法 2.0
class A: def __init__(self): self.num1=100 self.__num2=200 def __test(self): print("私有方法%d%d"%(self.num1, self.__num2)) class B(A): def demo(self): 子類物件方法中不能訪問父類私有屬性方法 AttributeError: 'B' object has no attribute '_B__num2' print("訪問父類私有屬性%d"%self.__num2) self.__test #建立一個子類物件 b=B() print(b) <__main__.B object at 0x000000000266B1D0> #在外界不能直接訪問物件的 私有屬性呼叫私有方法 #print(b.__num2) <__main__.B object at 0x000000000266B1D0> b.demo()
子類物件 不能在自己的方法內部直接訪問父類的私有屬性或私有方法
子類物件 可以通過父類的公有方法間接訪問到 私有屬性或 私有方法
繼承有兩種用途:
一:繼承基類的方法,並且做出自己的改變或者擴充套件(程式碼重用)
二:宣告某個子類兼容於某基類,定義一個介面類Interface,介面類中定義了一些介面名(就是函式名)且並未實現介面的功能,子類繼承介面類,並且實現介面中的功能
寫在最後
今天只是簡單的說了一下繼承,繼承的知識點非常多,後續會補充python的介面類和抽象類等相關知識,希望大家繼續關注。
文章首發自公眾號【Ahab雜貨鋪】關注公眾號技術分享第一時間送達!