做網(wǎng)站需要注意的點(diǎn)圖片識(shí)別搜索引擎
Python中關(guān)于子類約束的開發(fā)規(guī)范
我們知道,在java和C#中有一種接口的類型,用來(lái)約束實(shí)現(xiàn)該接口的類,必須要定義接口中指定的方法
而在python中,我們可以基于父類+子類+異常來(lái)仿照著實(shí)現(xiàn)這個(gè)功能
class Base:def func():raise NotImplementedError(".authenticate() must be overridden.") # 必須實(shí)現(xiàn)該方法class Foo(Base):pass
如果你在子類Foo中沒有重寫父類的func
方法,總程序源碼的其他地方一定會(huì)使用Foo.func()
,從而導(dǎo)致程序報(bào)錯(cuò)
當(dāng)然我們還有另外一種方法,就是通過python內(nèi)置的abc模塊來(lái)進(jìn)行約束
import abcclass CacheBase(metaclass=abc.ABCMeta):@abc.abstractmethoddef get(self, key):pass@abc.abstractmethoddef set(self, key, value):passclass RedisCache(CacheBase):passredis_cache = RedisCache()
在這個(gè)實(shí)例中,我們通過bac模塊中的abc.ABCMeta
來(lái)創(chuàng)建了一個(gè)類CacheBase
,并在其中定義了2個(gè)方法,用修飾器@abc.abstractmethod
修飾
當(dāng)有子類繼承并實(shí)例化對(duì)象時(shí),如果子類沒有實(shí)現(xiàn)其中被@abc.abstractmethod
修飾器修飾的方法,就會(huì)報(bào)錯(cuò),在控制臺(tái)中也會(huì)有提示,讓我們重寫方法
當(dāng)我們重寫方法后,程序執(zhí)行就不會(huì)報(bào)錯(cuò)