python 類的繼承和派生

2021-03-02 學點編程吧
什麼是繼承

繼承是一種創建類的方法,在python中,一個類可以繼承來自一個或多個父類。原始類稱為基類或超類。

class ParentClass1:    pass

class ParentClass2:    pass

class SubClass1(ParentClass1):    pass

class SubClass2(ParentClass1,ParentClass2):    pass

查看繼承:

>>> SubClass2.__bases__(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

什麼時候用繼承

假如已經有幾個類,而類與類之間有共同的變量屬性和函數屬性,那就可以把這幾個變量屬性和函數屬性提取出來作為基類的屬性。而特殊的變量屬性和函數屬性,則在本類中定義,這樣只需要繼承這個基類,就可以訪問基類的變量屬性和函數屬性。可以提高代碼的可擴展性。

繼承和抽象(先抽象再繼承)

抽象即提取類似的部分。基類就是抽象多個類共同的屬性得到的一個類。

class Riven:    camp='Noxus'    def __init__(self,nickname,                 script,                 aggressivity=54,                 life_value=414,                 ):        self.nickname = nickname        self.aggressivity = aggressivity        self.life_value = life_value        self.script=script
   def attack(self,enemy):        print(self.script)        enemy.life_value -= self.aggressivity

class Garen:    camp='Demacia'    def __init__(self,nickname,                 script,                 aggressivity=58,                 life_value=455,                 ):        self.nickname = nickname        self.aggressivity = aggressivity        self.life_value = life_value        self.script = script
   def attack(self,enemy):        print(self.script)        enemy.life_value -= self.aggressivityg1=Garen("德瑪西亞之力","人在塔在")g1.camp="諾克薩斯"
r1=Riven("瑞雯","斷劍重鑄之日,騎士歸來之時")g1.attack(r1)print(r1.life_value)
人在塔在
356

Garen類和Riven類都有nickname、aggressivity、life_value、script四個變量屬性和attack()函數屬性,這裡可以抽象出一個Hero類,裡面有裡面包含這些屬性。

class Hero:    def __init__(self, nickname,                 script,                 aggressivity,                 life_value,                 ):        self.nickname = nickname        self.aggressivity = aggressivity        self.life_value = life_value        self.script = script
   def attack(self,enemy):        print("Hero.attack")        enemy.life_value -= self.aggressivity

class Riven(Hero):    camp='Noxus'    def __init__(self,nickname,script,aggressivity=54,life_value=414):        Hero.__init__(self,nickname,script,aggressivity,life_value)
   def attack(self,enemy):        print(self.script)        Hero.attack(self,enemy)

class Garen(Hero):    camp='Demacia'    def __init__(self,nickname,script,aggressivity=58,life_value=455):        Hero.__init__(self, nickname, script, aggressivity, life_value)    def attack(self,enemy):        print(self.script)        Hero.attack(self, enemy)g1=Garen("德瑪西亞之力","人在塔在")g1.camp="諾克薩斯"
r1=Riven("瑞雯","斷劍重鑄之日,騎士歸來之時")g1.attack(r1)print(r1.life_value)

人在塔在Hero.attack
356

嚴格來說,上述Hero.init(self,…),不能算作子類調用父類的方法。因為我們如果去掉(Hero)這個繼承關係,代碼仍能得到預期的結果。

總結python中繼承的特點:

在子類中,並不會自動調用基類的init(),需要在派生類中手動調用。

在調用基類的方法時,需要加上基類的類名前綴,且需要帶上self參數變量。

先在本類中查找調用的方法,找不到才去基類中找。

繼承的好處

提高代碼的復用。

繼承的弊端

可能特殊的本類又有其他特殊的地方,又會定義一個類,其下也可能再定義類,這樣就會造成繼承的那條線越來越長,使用繼承的話,任何一點小的變化也需要重新定義一個類,很容易引起類的爆炸式增長,產生一大堆有著細微不同的子類. 所以有個「多用組合少用繼承」的原則。

相關焦點

  • python中類的繼承和多態
    繼承是為了代碼復用和設計復用而設計的,是面向對象程序設計的重要特徵之一。當我們設計一個新類時,如果可以繼承一個已有的設計良好的類然後進行二次開發,無疑會大幅度減少開發工作量。1.類的繼承類繼承語法:Class 派生類名(基類名): #基類名寫在括號裡派生類成員在繼承關係中,已有的,設計好的類稱為父類或基類,新設計的類稱為子類或派生類。派生類可以繼承父類的公有成員,但是不能繼承其私有成員。
  • Python中的類繼承
    歡迎關注 「小白玩轉Python」,發現更多 「有趣」繼承是面向對象編程中的一個概念,現有的類可以被一個新的類修改。現有的類稱為基類,新類稱為派生類。在本文中,我們將討論python中的類繼承。讓我們開始吧!
  • Python類的概念、定義、屬性、繼承
    比如,list.append7.繼承用法: .在定義類時,可以從已有的類繼承, 被繼承的類稱為基類(父類),新定義的類稱為派生類(子類)。 .在類中找不到調用的屬性時就搜索基類, 如果基類是從別的類派生而來,這個規則會遞歸的應用上去。
  • 每日乾貨丨C++入門知識,C++繼承和派生詳解
    繼承和派生的概念通過特殊化已有的類來建立新類的過程, 叫做」類的派生」, 原有的類叫做」基類」, 新建立的類叫做」派生類」.
  • Python 實例:類的繼承與重載
    object基類的類(新類和經典類的區別就在於是否繼承於object類)。(1)類的繼承先來看Python類(新類)的繼承。使用一個最簡單的類和object類來比較一下。打開Putty,連接到Linux。
  • C#類之間存在繼承關係,什麼是繼承?如何實現類與類之間的繼承?
    在C#中,可以簡單地將繼承理解為:大分類和小分類之間存在的關係,小分類具有大分類所有的特徵,但大分類不一定具備所有小分類的特徵。將現實生活當中的繼承與C#語言中的繼承對應起來就是:指一個對象(轎車)直接使用另一對象(汽車)的屬性和方法。2.
  • 使用Python Super()為類提供繼承支持
    單繼承中的super()如果您不熟悉面向對象的編程概念,繼承可能是一個不熟悉的術語。 繼承是面向對象編程中的一個概念,其中類從另一個類派生(或繼承)屬性和行為,而無需再次實現它們。至少對我來說,在查看代碼時更容易理解這些概念,所以讓我們編寫描述繼承結構的類:
  • Python中你不知道的事:多繼承和類的方法,以及什麼是類的特殊方法
    可以同時繼承多個父類Python中可以有兩個以上的父類,當有A,B,C三個父類的時候,第三個父類可以同時繼承A與B兩類,C可以使用A與B中的屬性和方法。C類繼承A,B兩類特性輸出結果python 給繼承關係排列了一個順序,我們將它稱之為繼承樹。用print(D.
  • Python安裝教程和使用技巧
    具有可移植性,支持面向過程和面向對象編程,並且開源。window系統中,python有多種開發工具,例如1.直接在cmd命令窗口執行,但此種僅能單條語句執行,不能運行完整的程序。2.python自帶的集成開發環境,可通過開始——所有程序——python3.3——IDLE(Python GUI)啟動。
  • python | 關於多重繼承那些事
    什麼是多重繼承繼承是面向對象編程的一個重要的方式 ,通過繼承 ,子類就可以擴展父類的功能 。和 c++ 一樣 ,在 python 中一個類能繼承自不止一個父類 ,這叫做 python 的多重繼承(Multiple Inheritance )。多重繼承的語法與單繼承類似 。
  • 如何理解python中的類和對象?
    什麼是類和對象類和對象,在我們的生活中其實是很容易找例子的。類是一種把對象分組歸類的方法。比如動物,植物就可以看作是類,而大象,獅子就可以看作一個動物類中的對象;花,草可以看作是植物類中的對象。為什麼大象和獅子就劃分為動物類,花和草就劃分為植物類呢?
  • C++ 類、繼承、重載《Rice C++ 學習開發》
    繼承允許我們依據另一個類來定義一個類,這使得創建和維護一個應用程式變得更容易。這樣做,也達到了重用代碼功能和提高執行時間的效果。C++支持多繼承。一個派生類繼承了所有的基類方法,但下列情況除外:1.基類的構造函數、析構函數和拷貝構造函數。
  • Python類(4)類的繼承
    Python類(4)類的繼承類的繼承格式class 子類(基類): pass基類(父類): 被繼承者(先輩
  • C中的繼承和多態
    有了繼承和多態,我們可以完成代碼重用。在C中有許多技巧可以實現多態。本文的目的就是演示一種簡單和容易的技術,在C中應用繼承和多態。通過創建一個VTable(virtual table)和在基類和派生類對象之間提供正確的訪問,我們能在C中實現繼承和多態。VTable能通過維護一張函數表指針表來實現。為了提供基類和派生類對象之間的訪問,我們可以在基類中維護派生類的引用和在派生類中維護基類的引用。
  • Python獲取類的層次結構和繼承順序
    前情提要今天,我們繼續領略inspect模塊的一些高級用法——使用inspect模塊獲取一個類的層次結構和類的繼承順序。在出現嵌套列表的地方,它包含從緊靠列表前面的類派生的類,返回的每個條目都是一個2元組,包含一個類及其基類的元組。這是講了返回值參數「unique」默認為False,如果為True,則給定列表中每個類的返回結構中只會出現一個條目。否則,使用多重繼承的類及其子代將多次出現。
  • python他律筆記系列二
    (相當於中斷的返回)附:python3面向對象技術簡介類(class):用來描述具有相同屬性和方法的對象的集合(結構體是封裝的相同的屬性的集合,屬性就是變量,方法就是函數),對象是類的實例python的特點:類的繼承機制允許多個基類繼承(JavaScript中貌似只能單態繼承),派生類可以覆蓋基類中的任何方法,方法中可以調用基類中的同名方法(也就是說子類的函數名可以與父類的函數名相同
  • 乾貨Python類和元類(metaclass)的理解和簡單運用
    (一) python中的類這裡討論的python
  • Python學習:類和實例
    Python使用class關鍵字來定義類,其基本結構如下:class 類名(父類列表):    pass類名通常採用駝峰式命名方式,儘量讓字面意思體現出類的作用。Python採用多繼承機制,一個類可以同時繼承多個父類(也叫基類、超類),繼承的基類有先後順序,寫在類名後的圓括號裡。繼承的父類列表可以為空,此時的圓括號可以省略。
  • 淺析 Python 的類、繼承和多態
    繼承舉一個教科書中最常見的例子。Circle 和 Rectangle 繼承自 Shape,不同的圖形,面積(area)計算方式不同。is Circle.areaFalse通過類的字典更能明顯地看清這一點:>>> Shape.
  • 從零入門量化交易系列-python的面向對象
    封裝:將內部實現包裹起來,對外透明,提供api接口進行調用的機制繼承:即一個派生類(derived class)繼承父類(base class)的變量和方法。多態:根據對象類型的不同以不同的方式進行處理。