一日一技:在 Python 里面如何實(shí)現(xiàn)一個(gè)抽象類(lèi)
在某個(gè)在線(xiàn)教育的網(wǎng)站上設(shè)計(jì)模式相關(guān)的課程中,某老師說(shuō) Python 不支持抽象類(lèi)和接口。
但實(shí)際上,Python 支持抽象類(lèi)。Python 自帶的abc模塊用于實(shí)現(xiàn)抽象類(lèi)相關(guān)的定義和操作。
我們通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明,如何在 Python 中實(shí)現(xiàn)抽象類(lèi):
- from abc import ABC, abstractmethod
- class People(ABC):
- @abstractmethod
- def walk(self):
- pass
- @abstractmethod
- def eat(self):
- pass
- def dance(self):
- print('我正在跳舞')
從abc模塊導(dǎo)入ABC類(lèi),和abstractmethod抽象方法裝飾器?;贏BC類(lèi)可以實(shí)現(xiàn)一個(gè)抽象類(lèi)。通過(guò)@abstractmethod裝飾一個(gè)方法,讓它成為一個(gè)抽象方法。抽象方法在子類(lèi)中必需被實(shí)現(xiàn)。
抽象類(lèi)不能被實(shí)例化,所以我們實(shí)例化一下,可以看到這里報(bào)錯(cuò)了,如下圖所示:
我們?cè)倏匆幌?,如果繼承抽象類(lèi),但是沒(méi)有實(shí)現(xiàn)其中的某個(gè)抽象方法,也會(huì)導(dǎo)致報(bào)錯(cuò)。如下圖所示:
當(dāng)我們把所有抽象方法都實(shí)現(xiàn)了以后,子類(lèi)就能夠正常初始化了,如下圖所示:
抽象類(lèi)People中的dance不是抽象方法,所以子類(lèi)不需要覆蓋。抽象類(lèi)是軟件開(kāi)發(fā)中一個(gè)非常重要的概念,通過(guò)定義抽象類(lèi),我們可以約定子類(lèi)必需實(shí)現(xiàn)的方法。當(dāng)我們一個(gè)類(lèi)有幾十上百個(gè)方法時(shí),用抽象方法來(lái)防止子類(lèi)漏掉某些方法是非常方便的做法。