一日一技:如何讓 Python 提醒你不能覆蓋某個父類方法?
在前幾天的文章:一日一技:在 Python 里面如何實現(xiàn)一個抽象類中,我們講到Python 可以實現(xiàn)一個抽象類。抽象類里面有一些抽象方法,在繼承這個抽象類的時候,子類必須實現(xiàn)這些抽象方法。
有時候,我們希望在父類中保留一些方法,子類在繼承父類的時候,不準覆蓋這些方法。這個功能,在 Java 中叫做@final。
Python 原生的語句和關鍵詞,無法禁止開發(fā)者覆蓋父類的某個方法。但是,如果你需要的不是禁止,而是在你不小心覆蓋的時候,Python 能提醒你的話,那么 Python 從3.8開始就能原生做到。這就是類型標注中的final關鍵字。
如果你不知道什么叫做類型標注,或者不知道它有什么用,那么你可以看我以前的兩篇文章:《一日一技:在Python中使用類型標注》、《一日一技:通過Python 3的類型標注提高PyCharm的自動補全能力》。
要使用這個功能,有一個前提,就是你需要使用 PyCharm 或者 VSCode 這種支持識別類型標注的 IDE,或者你的項目使用 mypy 來做靜態(tài)檢查。我們以 PyCharm 為例。
打開 PyCharm,我們來寫一個類:
- class Animal:
- def walk(self):
- ...
- def dead(self):
- print('所有生物都會死亡,沒有例外')
- class Dog(Animal):
- def __init__(self, name):
- self.name = name
- def walk(self):
- print('使用四只腳走路')
- def dead(self):
- print('狗不會死亡')
- wangcai = Dog('旺財')
- wangcai.walk()
- wangcai.dead()
運行效果如下圖所示:
可以看到,子類Dog覆蓋了父類Animal里面的兩個方法walk和dead?,F(xiàn)在,我不想讓開發(fā)者覆蓋dead方法,如果發(fā)現(xiàn)他覆蓋了,就要通過 IDE 發(fā)出提醒。這個時候,就可以使用final關鍵詞,如下圖所示:
我們只需要from typing import final,然后使用這個裝飾器@final來裝飾不想被覆蓋的方法,那么,當子類試圖覆蓋它的時候,IDE 就會通過黃色的背景來提醒你這個地方有問題。
在 typing 里面,除了final裝飾器,還有一個Final類型。這個類型可以用來設定常量,例如:
- from typing import Final
- PI: Final[float] = 3.141592653
- PI = 3.2
運行效果如下圖所示:
但需要注意的是,類型標注起的是提醒的作用,如果你要不顧提醒強行違反也沒有問題。
本文說到的是如何提醒開發(fā)者不要覆蓋父類方法。我們也可以通過自定義一個裝飾器,來實現(xiàn)真正禁止其他人覆蓋父類的方法。發(fā)現(xiàn)覆蓋就報錯。如果大家有興趣,請在本文下面留言,我們下一篇文章就寫。
本文轉(zhuǎn)載自微信公眾號「未聞Code」,可以通過以下二維碼關注。轉(zhuǎn)載本文請聯(lián)系未聞Code生公眾號。