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