Python中的方法重寫與名稱修飾
今天寫python系統(tǒng)的時(shí)候,發(fā)現(xiàn)父類怎么老是調(diào)用不了子類重寫的方法,整了好久才發(fā)現(xiàn),python的名稱修飾機(jī)制,好久沒(méi)寫代碼了,這一塊知識(shí)點(diǎn)忘干凈了,下面進(jìn)行總結(jié)。

在Python中,方法重寫是面向?qū)ο缶幊讨械闹匾拍?,它允許子類對(duì)父類的方法進(jìn)行重新定義以滿足子類特有的需求。然而,在方法重寫過(guò)程中,有一個(gè)有趣的機(jī)制稱為名稱修飾(name mangling),它影響了以雙下劃線開頭的方法名。在本篇博客中,我們將探討Python中的方法重寫和名稱修飾的工作原理和使用方法。
1. 方法重寫(Method Overriding)
方法重寫是指在子類中重新定義一個(gè)與父類方法名稱相同的方法。這樣,當(dāng)通過(guò)子類對(duì)象調(diào)用該方法時(shí),將執(zhí)行子類中的方法而不是父類中的方法。方法重寫使得子類可以自定義和修改父類方法的行為,實(shí)現(xiàn)更靈活和具有特定功能的子類。
示例:
class Parent: ? ?
????def some_method(self): ? ? ? ?
????????print("Parent's method")
class Child(Parent): ? ?
????def some_method(self): ?# 方法重寫
? ? ? ?
????????print("Child's method")?
child_obj = Child()?
child_obj.some_method()??
# 輸出:"Child's method"
2. 名稱修飾(Name Mangling)
名稱修飾是Python中用于避免子類意外地覆蓋父類方法或?qū)傩缘臋C(jī)制。當(dāng)方法或?qū)傩缘拿Q以雙下劃線__
開頭時(shí),Python會(huì)在名稱前面添加一個(gè)下劃線和類名,形成_類名__方法名
的形式。這樣,即使子類定義了與父類同名的方法,實(shí)際上它們的名稱并不相同,從而避免了沖突。
示例:
class Parent: ? ?
????def __some_method(self): ?# 名稱修飾
? ? ? ?
????????print("Parent's method")
class Child(Parent): ? ?
????def __some_method(self): ?# 名稱修飾后,實(shí)際上成為 _Child__some_method
? ? ? ?????print("Child's method")?
child_obj = Child()?
child_obj._Child__some_method() ?
# 輸出:"Child's method"
示例2:
class Parent:? ??
????def B(self):
? ? ? ?
????????self.__A() ?# 在父類的B方法中調(diào)用A方法
? ?
????def?__A(self): ? ? ? ?
????????print("Parent's A method")
class Child(Parent): ? ?
def B(self): ? ? ? ?
????return super(Child, self).B() ?# 使用super()調(diào)用父類的B方法
? ?
def?__A(self): ?# 子類沒(méi)有成功重寫? ? ? ??
????print("Child's A method")# 創(chuàng)建子類對(duì)象
child_obj = Child()# 實(shí)際上調(diào)用父類的__A方法
# 輸出:"Parent's A method"
3. 以單下劃線_
開頭的方法名
在Python中,以單下劃線_
開頭的方法名并不會(huì)觸發(fā)名稱修飾機(jī)制。這樣的方法被視為內(nèi)部實(shí)現(xiàn)細(xì)節(jié),建議在外部使用時(shí)要謹(jǐn)慎。子類可以定義以單下劃線開頭的方法,并且與父類的同名方法不會(huì)發(fā)生沖突。
示例:
class?Parent:? ??
????def?B(self): ? ??? ?
????????self._A() ?# 在父類的B方法中調(diào)用A方法?? ?
????def?_A(self): ? ? ? ?
????????print("Parent's A method")
class?Child(Parent): ? ?
def?B(self): ? ? ? ?
????return?super(Child, self).B() ?# 使用super()調(diào)用父類的B方法?? ?
def?_A(self): ?# 子類成功重寫? ? ? ??
????print("Child's A method")# 創(chuàng)建子類對(duì)象
child_obj = Child()# 實(shí)際上調(diào)用子類的_A方法
# 輸出:"Child's A method"
總結(jié)
方法重寫是Python中面向?qū)ο缶幊痰闹匾匦裕试S子類重新定義父類的方法以實(shí)現(xiàn)個(gè)性化的功能。名稱修飾是一種機(jī)制,用于避免子類意外地覆蓋父類方法或?qū)傩?,通過(guò)在名稱前添加_類名
來(lái)解決命名沖突問(wèn)題。此外,以單下劃線開頭的方法名不會(huì)觸發(fā)名稱修飾,但應(yīng)謹(jǐn)慎使用,避免對(duì)外部代碼造成意外影響。了解方法重寫和名稱修飾的原理,將有助于編寫更具靈活性和清晰性的Python類和繼承關(guān)系。