本文研究的主要是Python面向對象之繼承的相關內容,具體如下。
Python 繼承
即一個派生類(derived class)繼承基類(bass class)字段和方法。繼承也允許把一個派生類的對象作為一個基類對象對待。例如,有這樣一個設計,一個Cat類型的對象派生自Animal類,這是模擬”是一個(is-a)”關系(例如,Cat是一個Animal)。
繼承實現了代碼的重用。
繼承的基本語法:
class 派生類名(基類名1 [, 基類名2....]):
基類名寫在括號里,基本類是在類定義的時候,在元組之中指明的。如果在繼承元組中列了一個以上的類,那么它就被稱作”多重繼承” 。
多重繼承
Python支持多重繼承,也就是一個子類可以有多個父類,父類間用逗號隔開。
在多重繼承中,子類有那么多的父類,那子類實例化時,構造方法是怎樣調用的呢?
這里需要記住一點:
多重繼承中,構造方法以第一個父類為中心。如果子類重新定義了構造方法,就不會調用父類的構造方法,構造就會只調用第一個父類的構造方法,并且如果父類中有同名的方法時,通過子類的實例對象去調用的該方法也是第一個父類中的方法。當然如果你需要在子類中用來某個或某幾個父類的構造方法,需要顯示的去調用父類的構造方法。
在python中繼承中的一些特點:
- 在繼承中基類的構造(__init__()方法)不會被自動調用,它需要在其派生類的構造中親自專門調用。
- 在調用基類的方法時,需要加上基類的類名前綴,且需要帶上self參數變量。區別于在類中調用普通函數時并不需要帶上self參數。
- Python總是首先查找對應類型的方法,如果它不能在派生類中找到對應的方法,它才開始到基類中逐個查找。(先在本類中查找調用的方法,找不到才去基類中找)。
- 子類只繼承父類所有公有的屬性和方法,并且也可以在子類中通過父類名來調用,而對于私有的屬性和方法,子類是不進行繼承的,因此在子類中是無法通過父類名來訪問的。
實例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
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
解析:
1
2
|
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面向對象之繼承代碼詳解的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
原文鏈接:http://blog.csdn.net/seetheworld518/article/details/48810183