純虛函數(shù)與抽象類都是Python面向?qū)ο笾兄匾木幊谭妒秸糜趯^承類做強制性接口實現(xiàn)約定离唐。
abc模塊包含了一系列與抽象基類與純虛函數(shù)相關(guān)的方法嗤疯。Python中通過修改元類進行抽象基類的設(shè)定肯夏。這里Python2與3的語法不一致蹈集。Python2中為:
from abc import ABCMeta, abstractmethod
class Test(object):
??? __metaclass__ = ABCMeta
而Python3中為:
from abc import ABC, abstractmethod
class Test(ABC):
可見Python2中通過修改__metaclass__類變量指定元類烁试,而Python3中直接繼承ABC類即可。
一個抽象基類只能被繼承拢肆,而其本身無法被實例化减响。在抽象基類中可定義純虛函數(shù),又稱為抽象方法郭怪。這樣的方法類似于其他語言中的接口聲明支示,只能夠被繼承類重寫后進行調(diào)用,其本身無法被調(diào)用鄙才。且繼承此抽象基類的所有類必須強制實現(xiàn)基類中定義的所有純虛函數(shù)颂鸿,否則代碼將報錯≡茆郑可見嘴纺,純虛函數(shù)是對當(dāng)前抽象基類的繼承者所進行的一種接口約束败晴,如果想要繼承當(dāng)前父類,則需要實現(xiàn)父類中所規(guī)定的必須實現(xiàn)的接口栽渴。
純虛函數(shù)通過abstractmethod裝飾器進行聲明:
from abc import ABC, abstractmethod
class Test(ABC):
??? @abstractmethod
??? def absMethod(self):
??????? pass
class InsTest(Test):
??? def absMethod(self):
???????print('abstractmethod')
test = InsTest()
test.absMethod()
上例中尖坤,繼承自Test父類的子類InsTest必須實現(xiàn)父類中定義的所有純虛函數(shù)。純虛函數(shù)的實現(xiàn)只要求函數(shù)名一致闲擦,參數(shù)聲明可以不一致糖驴。