在 Python 中如何實現類的繼承,方法重載及重寫?
來源 | CSDN博客今天我們將進入類的繼承以及對類的方法重寫及重載的學習!話不多說直接進入正題!!
類的繼承
如果要編寫的類是另一個現成類的特殊版本,那我們就可以使用繼承。一個類繼承另一個類時,將自動獲得另一個類的所有屬性和方法,原有的類稱為父類,而新的類稱為子類,子類繼承父類的所有屬性和方法,同時還可以定義自己的屬性和方法。繼承的特點
- 如果在子類中需要父類的構造方法就需要調用父類的構造方法,或者不重寫父類的構造方法。
- 在調用父類的方法時,需要加上父類的類名前綴,且需要帶上 self 參數變量。區別在于類中調用普通函數時并不需要帶上 self 參數。
- Python 總是首先查找對應類型的方法,如果它不能在子類中找到對應的方法,它才開始到父類中逐個查找。(先在子類中查找調用的方法,找不到才去夫類中找)。
子類不重寫__ init __ 的繼承(子類需要自動調用父類的方法)子類不重寫 __ init __,實例化子類時,會 自動調用父類定義的 __ init __。
# 創建一個父類class Base_father: def __init__(self,name,age): self.name = name self.age = age print('調用了父類的name')
# 創建子類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 __方法,在調用子類進行實例化時,就默認調用父類的 __ init __ 方法。
子類重寫__ init __ 的繼承(子類不需要自動調用父類的方法)如果重寫了__ init __ 時,實例化子類,就不會調用父類已經定義的 __ init __。
運行結果:# 創建一個父類class Base_father: def __init__(self,name,age): self.name = name self.age = age print('調用了父類的name')
# 創建子類class Base_son(Base_father): def __init__(self,name,age): self.name = name self.age = age print('調用了我自己定義的方法!!')
def getname(self): print(f'姓名:{self.name}') print(f'年齡:{self.age}') return '運行完畢!!'
num1 = Base_son('suliang',21)print(num1.getname())
子類重寫 __init __ ,并且繼承父類的構造方法(super)
如果重寫了__ init __ 時,要繼承父類的構造方法,可以使用 super關鍵字。語法:super(子類,self).__ init __(參數)
# 創建一個父類class Base_father: def __init__(self,name,age): self.name = name self.age = age print('調用了父類的name')運行結果:
# 創建子類class Base_son(Base_father): def __init__(self,name,age): #利用super調用父類的構造函數 super(Base_son, self).__init__(name ,age) print('-'*50) self.name = name self.age = age print('調用了我自己定義的方法!!')
def getname(self): print(f'姓名:{self.name}') print(f'年齡:{self.age}') return '運行完畢!!'
num1 = Base_son('suliang',21)print(num1.getname())
子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值和形參都不能改變。優點:子類可以根據需要,定義特定于自己的行為。也就是說子類能夠根據需要實現父類的方法。重載重載(overloading) 是在一個類里面,方法名字相同,而參數不同。返回類型可以相同也可以不同。每個重載的方法(或者構造函數)都必須有一個獨一無二的參數類型列表。二者區別
- 方法重載是一個類中定義了多個方法名相同,而他們的參數的數量不同或數量相同而類型和次序不同,則稱為方法的重載。
- 方法重寫是在子類存在方法與父類的方法的名字相同,而且參數的個數與類型一樣,返回值也一樣的方法,就稱為重寫。
- 方法重載是一個類的多態性表現,而方法重寫是子類與父類的一種多態性表現。
對方法重寫如果父類方法的功能不能滿足你的需求,就可以在子類重寫你父類的方法。
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 '執行完畢!!'
num1 = Son('suliang')print(num1.list())
運行結果:
基礎重載方法
構造函數
__ init __ ( self [,args] )
- 析構方法,刪除一個對象
__ del __( self )
- 轉化為供解釋器讀取的形式
__ repr __( self )
- 用于將值轉化為適于人閱讀的形式
__ str __( self )
- 對象比較
__ cmp __ ( self, x )
方法重載的具體方法將在下一章進行詳細介紹。在此之作簡單說明!!類的屬性和方法()
類的私有屬性
在定義類的屬性時,在前面加入__(兩個下劃線)即代表私有屬性,只能在類的內部調用,而不能在外部調用。
class List: a = 5 #類的公有屬性 __b = 6 #類的私有屬性
obj = List()print(obj.a)print(obj.__b)
運行結果:
在定義方法時,在前面加入 __ (兩個下劃線)即可定義一個私有方法,只能在類的內部調用,語法為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() # 在內部調用私有方法 return ' '
obj = List(5,10)print(obj.pri1())print(obj.pri3())
運行結果:
以單下劃線開頭的表示的是 protected 類型的變量,即保護類型只能允許其本身與子類進行訪問。
雙下劃線的表示的是私有類型(private)的變量, 只能是允許這個類本身進行訪問了。
_前面雙下劃線_定義的是特殊方法,一般是系統定義名字 ,類似 __ init __() 之類的。小結
本篇文章帶大家了解了類的繼承,方法的重寫以及重載的內容。一頓操作下來是不是覺得并不難呢,當然這都是基礎語法,深入的還需大家理解這其中的內涵,再慢慢的去實踐。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。