即乙個派生類(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"
defparentmethod
(self):
print
'calling parent method'
defsetattr
(self, attr):
parent.parentattr = attr
defgetattr
(self):
print
"parent attribute :", parent.parentattr
class
child1
(parent):
# define child1 class
def__init__
(self):
print
"calling child1 constructor"
defchildmethod
(self):
print
'calling child1 method'
parent.parentmethod(self) #呼叫基類的方法,所以要加上引數self
class
child2
(parent):
# define child2 class
defchildmethod
(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
constructor
c1.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()方法來檢測類之間的關係:
Python 物件導向之繼承
繼承是指乙個物件直接使用另一物件的屬性和方法 子承父業 一般是類與類之間的。物件導向程式設計 oop 語言的乙個主要功能就是 繼承 繼承是指這樣一種能力 它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。通過繼承建立的新類稱為 子類 或 派生類 被繼承的類稱為 基類...
python物件導向之繼承
繼承具有傳遞性 當父類方法的實現不能滿足子類的需求的時候 可以對父類方法進行重寫 1.覆蓋父類方法 2.對父類的方法進行擴充套件 class animal def eat self print 吃!def drink self print 喝!def run self print 跑!def sle...
Python物件導向之繼承
任務 定義乙個四邊形父類 quadrilateral,給定了乙個長方形子類 rectangle,在父類中定義乙個 area 方法用於求四邊形的面積。請在下面的begin end之間按照注釋中給出的提示編寫正確的 begin 定義四邊形父類quadrilateral,並在類中定義乙個area方法用於求...