python中的繼承原則


 繼承是面向對象的重要特征之一,繼承是兩個類或者多個類之間的父子關系,子進程繼承了父進程的所有公有實例變量和方法。繼承實現了代碼的重用。重用已經存在的數據和行為,減少代碼的重新編寫,python在類名后用一對圓括號表示繼承關系, 括號中的類表示父類,如果父類定義了__init__方法,則子類必須顯示地調用父類的__init__方法,如果子類需要擴展父類的行為,可以添加__init__方法的參數。
下面演示繼承的實現
class Fruit:
      def __init__(self, color):
           self.color = color
           print "fruit's color: %s" %self.color
 
      def grow(self):
           print "grow..."
 
class Apple(Fruit):                               #繼承了父類
      def __init__(self, color):                  #顯示調用父類的__init__方法
           Fruit.__init__(self, color)
           print "apple's color: %s" % self.color
 
class Banana(Fruit):                              #繼承了父類
      def __init__(self, color):                  #顯示調用父類的__init__方法
           Fruit.__init__(self, color)
           print "banana's color:%s" %s self.color
 
      def grow(self):                             #覆蓋了父類的grow方法
           print "banana grow..."
 
if __name__ == "__main__":
apple = Apple("red")
apple.grow()
banana = Banana("yellow")
banana.grow()
輸出結果:
           fruit‘s color : red
           apple's color : red
 
           grow...
 
           fruit's color : yellow
           banana's color : yellow
           banana grow...
 
抽象類的模擬
     抽象類是對一類事物特征和行為的抽象,抽象類由抽象方法組成,python2.5沒有提供抽象類的語法,抽象類的特征是不能被實例化,但是可以通過python的NotImplementedError類來模擬抽象類,NotImplementedError類繼承自python運行時錯誤類RuntimeError。當對抽象類進行實例化時,將拋出異常。
模擬抽象類的實現
def abstract():                                 #定義了全局函數
     raise NotImplimentedError(“abstract”):
         
class Fruit:
     def __init__(self):
          if self.__class__ is Fruit:            #如果實例化的類是Fruit,則拋出異常
               abstract()
          print "Fruit..."
 
class Apple(Fruit):
     def __init__(self):
          Fruit.__init__(self)
          print "Apple..."
 
if __name__ == "__main__":
apple = Apple()                                   #輸出: Fruit   Apple
同樣python也沒有提供對接口的支持。接口是特殊的抽象類,接口沒有數據成員,而是一組未實現的方法的集合。
 
 
---------------------------------------------------------------

只要涉及到面向對象,”類“是必須出現的一個代名詞。

類和對象是面向對象編程的兩個主要方面。創建一個新類型,而對象是這個類的實例。

類的一些概念:

包括初始化方法__init__,可以理解為構造,self,理解為this,等等在前一篇文章中介紹過,現在就學習類的繼承。

繼承:

面向對象的編程帶來的主要好處之一是代碼的重用,實現這種重用的方法之一是通過繼承機制。繼承完全可以理解成類之間的類型和子類型關系。

需要注意的地方:繼承語法   class 派生類名(基類名)://...   基類名寫作括號里,基本類是在類定義的時候,在元組之中指明的。這與c#是有區別的。

何時使用繼承:假如我需要定義幾個類,而類與類之間有一些公共的屬性和方法,這時我就可以把相同的屬性和方法作為基類的成員,而特殊的方法及屬性則在本類中定義,這樣只需要繼承基類這個動作,就可以訪問到基類的屬性和方法了,它提高了代碼的可擴展性。

任何事情都有利有弊:繼承的一個弱點就是,可能特殊的本類又有其他特殊的地方,又會定義一個類,其下也可能再定義類,這樣就會造成繼承的那條線越來越長,使用繼承的話,任何一點小的變化也需要重新定義一個類,很容易引起類的爆炸式增長,產生一大堆有着細微不同的子類. 所以有個“多用組合少用繼承”的原則,(我覺得兩者一起使用才是最佳吧*^◎^*)

在python中繼承中的一些特點:

1:在繼承中基類的構造(__init__()方法)不會被自動調用,它需要在其派生類的構造中親自專門調用。有別於C#

2:在調用基類的方法時,需要加上基類的類名前綴,且需要帶上self參數變量。區別於在類中調用普通函數時並不需要帶上self參數

3:Python總是首先查找對應類型的方法,如果它不能在派生類中找到對應的方法,它才開始到基類中逐個查找。(先在本類中查找調用的方法,找不到才去基類中找)。

如果在繼承元組中列了一個以上的類,那么它就被稱作“多重繼承” 。

實例:定義一個模塊,模塊里定義了一個基類:

子類:

輸出:

 假如在子類中不用__init__()初始化函數,那么子類會繼承基類的屬性,如:

 輸出:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM