Python強(qiáng)制子類重寫(xiě)父類的兩種方法實(shí)現(xiàn)
Python v3.7.0
方案一(推薦)
定義抽象基類,只要把一個(gè)方法定義成抽象方法,那解釋器就會(huì)要求子類必須重寫(xiě)這個(gè)方法,要注意的是,如果抽象方法沒(méi)有被重寫(xiě),那么子類在實(shí)例化時(shí),就會(huì)拋出TypeError異常,而不需要等到調(diào)用函數(shù)。
import abc
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def speak(self):
pass
class Dog(Animal):
def run(self):
pass
if __name__ == '__main__':
dog = Dog()
運(yùn)行以上代碼,會(huì)拋出異常:
TypeError: Can't instantiate abstract class Dog with abstract methods speak
只有在Dog子類中,重寫(xiě)speak方法,才可以正常實(shí)例化子類。
方案二
指定父類方法拋出NotImplementedError異常
class Animal1():
def speak(self):
raise NotImplementedError
class Dog1(Animal1):
def run(self):
pass
if __name__ == '__main__':
dog = Dog1()
dog.speak()
子類中若沒(méi)有重寫(xiě)speak方法,也可以正常實(shí)例化,但是調(diào)用此方法時(shí),就會(huì)拋出NotImplementedError異常。
補(bǔ)充
在父類中定義的私有方法,其作用范圍僅在當(dāng)前類,若在子類中重寫(xiě),實(shí)際上并不會(huì)起效果,原因:以雙下劃線前綴開(kāi)頭的屬性或方法,Python解釋器會(huì)重寫(xiě)其名稱,以便在類被擴(kuò)展的時(shí)候不容易產(chǎn)生沖突,這被稱之為名稱修飾(name mangling),如下所示:
class Test:
def __init__(self):
self.__foo = True
def __bar(self):
return "bar"
t = Test()
print(dir(t))
print(t._Test__foo)
print(t._Test__bar())
輸出內(nèi)容如下,注意列表前兩個(gè)值,這同時(shí)也說(shuō)明在Python中是沒(méi)有絕對(duì)私有的變量或方法的。
['_Test__bar', '_Test__foo', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
True
bar
在類的繼承中,如果在子類中重寫(xiě)了父類方法,但有時(shí)也希望能同時(shí)實(shí)現(xiàn)父類的功能,最常見(jiàn)的場(chǎng)景之一就是父類構(gòu)造方法中的初始值無(wú)法被繼承,可以在子類中使用super 函數(shù)來(lái)調(diào)用父類中的方法,特別是多重繼承的情況;如下面的例子:
class Animal:
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print('No!')
else:
print('Yes!')
class Bird(Animal):
def __init__(self):
self.song = '~~~'
def sing(self):
print(self.song)
bird = Bird()
bird.sing() # 正常
bird.eat() # 拋出異常:AttributeError: 'Bird' object has no attribute 'hungry'
解決的方法是在子類的構(gòu)造函數(shù)中,使用super方法調(diào)用父類的構(gòu)造函數(shù),如下:
class Bird(Animal):
def __init__(self):
super().__init__()
self.song = '~~~'到此這篇關(guān)于Python強(qiáng)制子類重寫(xiě)父類的兩種方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python強(qiáng)制子類重寫(xiě)父類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python根據(jù)時(shí)間生成mongodb的ObjectId的方法
這篇文章主要介紹了python根據(jù)時(shí)間生成mongodb的ObjectId的方法,涉及Python操作mongodb數(shù)據(jù)庫(kù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
python通過(guò)tcp發(fā)送xml報(bào)文的方法
今天小編就為大家分享一篇python通過(guò)tcp發(fā)送xml報(bào)文的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
python中字典(Dictionary)用法實(shí)例詳解
這篇文章主要介紹了python中字典(Dictionary)用法,以實(shí)例形式較為詳細(xì)的分析了Python字典建立、添加、刪除等常見(jiàn)操作技巧,需要的朋友可以參考下2015-05-05
基于python實(shí)現(xiàn)弱密碼檢測(cè)工具
Python中一個(gè)強(qiáng)大的加密模塊,提供了許多常見(jiàn)的加密算法和工具,本文我們將使用Python編寫(xiě)一個(gè)弱密碼檢測(cè)工具,感興趣的小伙伴可以了解一下2024-01-01
從零帶你使用Python實(shí)現(xiàn)RAG(檢索增強(qiáng)生成)系統(tǒng)
檢索增強(qiáng)生成(Retrieval-Augmented Generation, RAG)是當(dāng)下最熱門(mén)的 AI 應(yīng)用架構(gòu)之一,本文將帶你從零開(kāi)始,用 Python 完整實(shí)現(xiàn)一個(gè) RAG 系統(tǒng),涵蓋文檔加載,文本分塊,向量嵌入,語(yǔ)義檢索與生成回答的完整鏈路2026-04-04
python爬蟲(chóng)之場(chǎng)內(nèi)ETF基金獲取
這篇文章主要介紹了python爬蟲(chóng)之場(chǎng)內(nèi)ETF基金獲取,ETF?是一種場(chǎng)內(nèi)交易型基金,可以在盤(pán)中進(jìn)行交易,交易性比場(chǎng)外基金強(qiáng)一點(diǎn),下文基于python的相關(guān)資料展開(kāi),需要的小伙伴可以參考一下2022-05-05
Python selenium模擬網(wǎng)頁(yè)點(diǎn)擊爬蟲(chóng)交管12123違章數(shù)據(jù)
本次介紹怎么以模擬點(diǎn)擊方式進(jìn)入交管12123爬取車輛違章數(shù)據(jù),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05

