您好,登錄后才能下訂單哦!
這篇文章主要介紹了Python中面向對象之繼承的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
Python 繼承
即一個派生類(derived class)繼承基類(bass class)字段和方法。繼承也允許把一個派生類的對象作為一個基類對象對待。例如,有這樣一個設計,一個Cat類型的對象派生自Animal類,這是模擬”是一個(is-a)”關系(例如,Cat是一個Animal)。
繼承實現了代碼的重用。
繼承的基本語法:
class 派生類名(基類名1 [, 基類名2....]):
基類名寫在括號里,基本類是在類定義的時候,在元組之中指明的。如果在繼承元組中列了一個以上的類,那么它就被稱作”多重繼承” 。
多重繼承
Python支持多重繼承,也就是一個子類可以有多個父類,父類間用逗號隔開。
在多重繼承中,子類有那么多的父類,那子類實例化時,構造方法是怎樣調用的呢?
這里需要記住一點:
多重繼承中,構造方法以第一個父類為中心。如果子類重新定義了構造方法,就不會調用父類的構造方法,構造就會只調用第一個父類的構造方法,并且如果父類中有同名的方法時,通過子類的實例對象去調用的該方法也是第一個父類中的方法。當然如果你需要在子類中用來某個或某幾個父類的構造方法,需要顯示的去調用父類的構造方法。
在python中繼承中的一些特點:
在繼承中基類的構造(__init__()方法)不會被自動調用,它需要在其派生類的構造中親自專門調用。
在調用基類的方法時,需要加上基類的類名前綴,且需要帶上self參數變量。區別于在類中調用普通函數時并不需要帶上self參數。
Python總是首先查找對應類型的方法,如果它不能在派生類中找到對應的方法,它才開始到基類中逐個查找。(先在本類中查找調用的方法,找不到才去基類中找)。
子類只繼承父類所有公有的屬性和方法,并且也可以在子類中通過父類名來調用,而對于私有的屬性和方法,子類是不進行繼承的,因此在子類中是無法通過父類名來訪問的。
實例:
class Parent(object): # define parent class parentAttr = 100 def __init__(self): print "Calling parent constructor" def parentMethod(self): print 'Calling parent method' def setAttr(self, attr): Parent.parentAttr = attr def getAttr(self): print "Parent attribute :", Parent.parentAttr class Child1(Parent): # define child1 class def __init__(self): print "Calling child1 constructor" def childMethod(self): print 'Calling child1 method' Parent.parentMethod(self) #調用基類的方法,所以要加上參數self class Child2(Parent): # define child2 class def childMethod(self): print 'Calling child2 method' self.parentMethod() #子類調用自己從父類那繼承過來的父類的方法 c1 = Child1() # 實例化子類 1 c2 = Child2() # 實例化子類 2 c1.childMethod() # 調用子類的方法 c2.childMethod() # 調用子類的方法 c1.parentMethod() # 調用父類方法 c1.setAttr(200) # 再次調用父類的方法 c1.getAttr() # 再次調用父類的方法
執行結果:
Calling child1 constructor
Calling parent constructor
Calling child1 method
Calling parent method
Calling child2 method
Calling parent method
Calling parent method
Parent attribute : 200
解析:
c1 = Child1() # 實例化子類 1 c2 = Child2() # 實例化子類 2
這兩句是創建Child1類和Child2類的實例對象,創建實例對象時,就會自動去調類的構造方法,如果子類中沒有建立自己的構造方法,就會調用父類的構造方法,所以打印結果為:
Calling child1 constructor
Calling parent constructorc1.childMethod() # 調用子類的方法
c2.childMethod() # 調用子類的方法
上面兩句分別調用的是對應子類的子類方法,由于在子類中都分別有調用父類的方法,所以打印結果為:
Calling child1 method
Calling parent method
Calling child2 method
Calling parent method
注意:
子類繼承父類以后,如果在子類在對父類的方法進行改造時,由需要用到父類的方法時,這個時候在子類中想要調用父類的方法時,該怎么做呢?有兩種方法:
Parent.parentMethod(self)
self.parentMethod()
第一種是直接用父類的類名.方法名去調用父類的方法,但是需要注意的時,這種調用方法必須將self作為參數傳進去并且作為第一個參數,表示指向指向這個類的實例本身。
第二種是直接用self去調用父類的方法,為什么可以這樣調用呢?因為一旦子類繼承了父類,那么子類就擁有父類所有的方法和屬性,所以此時父類的方法和屬性就相當于子類自己了,所以可以直接用self去直接調用實例的方法,而不用再傳入self參數了。
使用issubclass()或者isinstance()方法來檢測類之間的關系:
issubclass() - 布爾函數判斷一個類是另一個類的子類或者子孫類, 語法:issubclass(sub,sup)
。
isinstance(obj, Class) 布爾函數如果obj是Class類的實例對象或者是一個Class子類的實例對象則返回true。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Python中面向對象之繼承的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。