博客專欄

EEPW首頁 > 博客 > 在 Python 中如何實現(xiàn)類的繼承,方法重載及重寫?

在 Python 中如何實現(xiàn)類的繼承,方法重載及重寫?

發(fā)布人:AI科技大本營 時間:2022-06-19 來源:工程師 發(fā)布文章
作者 | 蘇涼.py

來源 | CSDN博客今天我們將進入類的繼承以及對類的方法重寫及重載的學習!話不多說直接進入正題??!

圖片

類的繼承


如果要編寫的類是另一個現(xiàn)成類的特殊版本,那我們就可以使用繼承。一個類繼承另一個類時,將自動獲得另一個類的所有屬性和方法,原有的類稱為父類,而新的類稱為子類,子類繼承父類的所有屬性和方法,同時還可以定義自己的屬性和方法。繼承的特點

  • 如果在子類中需要父類的構造方法就需要調(diào)用父類的構造方法,或者不重寫父類的構造方法。
  • 在調(diào)用父類的方法時,需要加上父類的類名前綴,且需要帶上 self 參數(shù)變量。區(qū)別在于類中調(diào)用普通函數(shù)時并不需要帶上 self 參數(shù)。
  • Python 總是首先查找對應類型的方法,如果它不能在子類中找到對應的方法,它才開始到父類中逐個查找。(先在子類中查找調(diào)用的方法,找不到才去夫類中找)。

子類不重寫__ init __ 的繼承(子類需要自動調(diào)用父類的方法)子類不重寫 __ init __,實例化子類時,會 自動調(diào)用父類定義的 __ init __。



















# 創(chuàng)建一個父類class Base_father:    def __init__(self,name,age):        self.name = name        self.age = age        print('調(diào)用了父類的name')

# 創(chuàng)建子類class Base_son(Base_father):
   def getname(self):        print(f'姓名:{self.name}')        print(f'年齡:{self.age}')        return '運行完畢!!'
num1 = Base_son('suliang',21)print(num1.getname())

運行結果:

圖片

在子類中沒有重寫 __ init __方法,在調(diào)用子類進行實例化時,就默認調(diào)用父類的 __ init __ 方法。

子類重寫__ init __ 的繼承(子類不需要自動調(diào)用父類的方法)

如果重寫了__ init __ 時,實例化子類,就不會調(diào)用父類已經(jīng)定義的 __ init __。



















# 創(chuàng)建一個父類class Base_father:    def __init__(self,name,age):        self.name = name        self.age = age        print('調(diào)用了父類的name')
# 創(chuàng)建子類class Base_son(Base_father):    def __init__(self,name,age):        self.name = name        self.age = age        print('調(diào)用了我自己定義的方法!!')
   def getname(self):        print(f'姓名:{self.name}')        print(f'年齡:{self.age}')        return '運行完畢?。?#39;
num1 = Base_son('suliang',21)print(num1.getname())

運行結果:圖片通過上面兩個例子就可以清楚的看到,若是子類自己定義了一個初始化方法 __ init __,那么將不在調(diào)用父類已經(jīng)調(diào)用好的 __ init __ 方法。

子類重寫 __init __ ,并且繼承父類的構造方法(super)



如果重寫了__ init __ 時,要繼承父類的構造方法,可以使用 super關鍵字。語法:super(子類,self).__ init __(參數(shù))

























# 創(chuàng)建一個父類class Base_father:    def __init__(self,name,age):        self.name = name        self.age = age        print('調(diào)用了父類的name')
# 創(chuàng)建子類class Base_son(Base_father):    def __init__(self,name,age):      #利用super調(diào)用父類的構造函數(shù)        super(Base_son, self).__init__(name ,age)        print('-'*50)        self.name = name        self.age = age        print('調(diào)用了我自己定義的方法??!')

   def getname(self):        print(f'姓名:{self.name}')        print(f'年齡:{self.age}')        return '運行完畢!!'
num1 = Base_son('suliang',21)print(num1.getname())
運行結果:圖片
圖片

方法的重寫及重載


重寫

子類對父類的允許訪問的方法的實現(xiàn)過程進行重新編寫, 返回值和形參都不能改變。優(yōu)點:子類可以根據(jù)需要,定義特定于自己的行為。也就是說子類能夠根據(jù)需要實現(xiàn)父類的方法。重載重載(overloading) 是在一個類里面,方法名字相同,而參數(shù)不同。返回類型可以相同也可以不同。每個重載的方法(或者構造函數(shù))都必須有一個獨一無二的參數(shù)類型列表。二者區(qū)別

  1. 方法重載是一個類中定義了多個方法名相同,而他們的參數(shù)的數(shù)量不同或數(shù)量相同而類型和次序不同,則稱為方法的重載。
  2. 方法重寫是在子類存在方法與父類的方法的名字相同,而且參數(shù)的個數(shù)與類型一樣,返回值也一樣的方法,就稱為重寫。
  3. 方法重載是一個類的多態(tài)性表現(xiàn),而方法重寫是子類與父類的一種多態(tài)性表現(xiàn)。

對方法重寫如果父類方法的功能不能滿足你的需求,就可以在子類重寫你父類的方法。















class Father:    def __init__(self,name):        self.name = name
   def list(self):        print(f'name:{self.name}')
class Son(Father):    def list(self):        print(f'姓名:{self.name}')        return  '執(zhí)行完畢??!'
num1 = Son('suliang')print(num1.list())

運行結果:

圖片

基礎重載方法

  • 構造函數(shù)

__ init __ ( self [,args] )

  • 析構方法,刪除一個對象

__ del __( self )

  • 轉化為供解釋器讀取的形式

__ repr __( self )

  • 用于將值轉化為適于人閱讀的形式

__ str __( self )

  • 對象比較

__ cmp __ ( self, x )

方法重載的具體方法將在下一章進行詳細介紹。在此之作簡單說明!!
圖片類的屬性和方法()

類的私有屬性

在定義類的屬性時,在前面加入__(兩個下劃線)即代表私有屬性,只能在類的內(nèi)部調(diào)用,而不能在外部調(diào)用。








class List:    a = 5 #類的公有屬性    __b = 6 #類的私有屬性
obj = List()print(obj.a)print(obj.__b)

運行結果:

圖片

類的私有方法

在定義方法時,在前面加入 __ (兩個下劃線)即可定義一個私有方法,只能在類的內(nèi)部調(diào)用,語法為self.__方法名




















class List:    def __init__(self ,a,b ):        self.a = a        self.b =b    def pri1(self):        # 定義一個公有方法        print(f'{self.a + self.b}')        return '  '    def __pri2(self):        # 定義一個私有方法        print(f'{self.a *self.b}')
   def pri3(self):        self.__pri2()  # 在內(nèi)部調(diào)用私有方法        return '  '
obj = List(5,10)print(obj.pri1())print(obj.pri3())

運行結果:

圖片


圖片

面向對象中下劃線的說明


_前面單下劃線

以單下劃線開頭的表示的是 protected 類型的變量,即保護類型只能允許其本身與子類進行訪問。

_前面雙下劃線

雙下劃線的表示的是私有類型(private)的變量, 只能是允許這個類本身進行訪問了。

_前面雙下劃線_定義的是特殊方法,一般是系統(tǒng)定義名字 ,類似 __ init __() 之類的。


圖片

小結


本篇文章帶大家了解了類的繼承,方法的重寫以及重載的內(nèi)容。一頓操作下來是不是覺得并不難呢,當然這都是基礎語法,深入的還需大家理解這其中的內(nèi)涵,再慢慢的去實踐。


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。



關鍵詞: 算法

相關推薦

技術專區(qū)

關閉