一日一技:如何禁止 Python 子類覆蓋父類方法?

      網(wǎng)友投稿 819 2025-04-01

      在昨天的文章里面,我們講到了,當(dāng)子類試圖覆蓋父類的時候,可以通過類型標(biāo)注來發(fā)出警告。今天,我們來講講如何直接禁止覆蓋。

      Python 原生是沒有提供禁止子類覆蓋父類的方法的功能,因此我們需要自己來實現(xiàn)。

      先來看一下實現(xiàn)效果:

      在這段代碼里面,我們禁止子類覆蓋父類的dead()和eat()方法,但不禁止move方法。所以,當(dāng)我們在子類Dog里面嘗試覆蓋父類中的dead()時,程序就報錯了。具體要覆蓋哪些方法,可以在定義類的時候指定,傳入的參數(shù)metaclass=protect('方法1', '方法2', '方法3', ...)就可以了。

      那么這個protect函數(shù)是個什么東西呢?我們來看看它的代碼:

      def protect(*protected): """Returns a metaclass that protects all attributes given as strings""" class Protect(type): has_base = False def __new__(meta, name, bases, attrs): if meta.has_base: for attribute in attrs: if attribute in protected: raise AttributeError('Overriding of attribute "%s" not allowed.'%attribute) meta.has_base = True klass = super().__new__(meta, name, bases, attrs) return klass return Protect

      一日一技:如何禁止 Python 子類覆蓋父類方法?

      這里,用到了 Python 的元類。如果大家對元類有興趣,可以看9.13 使用元類控制實例的創(chuàng)建 — python3-cookbook 3.0.0 文檔[1]。簡單的來說,元類用來定義類的創(chuàng)建行為。它一般的格式為:

      class 類名(metaclass=另一個類): ...

      而大家看我們用來禁止重試的這個函數(shù)protect,它返回的就是一個Protect類。這個類繼承于type對象。

      Protect類有一個__new__方法,這個方法會在使用了元類的所有子類的__init__之前被調(diào)用。在__new__里面,我們拿到了子類要定義的方法,并且檢查他們是不是在我們傳給protect的列表里面。如果在,說明這個方法不能被覆蓋。

      當(dāng)實現(xiàn)我們自己的父類Animal的時候,由于meta.has_base為?False,所以不會觸發(fā)檢查邏輯。但當(dāng)我們基于Animal實現(xiàn)Dog子類的時候,由于meta.has_base是True,所以進入檢查邏輯。Dog的所有方法名都在attrs參數(shù)里面。循環(huán)檢查每一個方法名是否在禁止的列表中,如果在,就拋出異常。如果不在,就繼續(xù)后面的創(chuàng)建過程。

      元類在理解上可能比較困難。如果大家無法理解上面這一段也沒有關(guān)系,直接用就是了。

      參考文獻

      Python

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:怎么把python程序附在文檔上(如何利用python在一個文檔里寫入)
      下一篇:wps怎么下載字體(wps怎么下載字體安裝包)
      相關(guān)文章
      国产亚洲一区二区在线观看| 亚洲AV永久无码精品放毛片| 亚洲一区二区三区免费| 国产亚洲精品AAAA片APP| 亚洲精品宾馆在线精品酒店| 在线亚洲午夜片AV大片| 亚洲AV无码久久久久网站蜜桃| 亚洲最大免费视频网| 亚洲成a人片毛片在线| 亚洲精品456在线播放| 亚洲成a人片毛片在线| 亚洲另类古典武侠| youjizz亚洲| 亚洲国产精品一区二区三区在线观看| 亚洲一卡2卡4卡5卡6卡残暴在线| 亚洲精品高清国产麻豆专区| 亚洲成a人片在线网站| 亚洲一区二区三区免费观看 | 国产亚洲老熟女视频| 国产AV无码专区亚洲AV漫画| 亚洲人JIZZ日本人| 亚洲动漫精品无码av天堂| 亚洲国产精品久久久久网站| 久久精品国产亚洲AV嫖农村妇女| 亚洲综合激情视频| 亚洲a级片在线观看| 国产 亚洲 中文在线 字幕| 亚洲精品无码久久久久久| 亚洲国产精品日韩av不卡在线| 亚洲国产成人久久精品软件 | 亚洲精品午夜无码专区| 亚洲成A人片777777| 亚洲成人动漫在线| 亚洲综合无码一区二区三区| 亚洲一卡二卡三卡四卡无卡麻豆| 亚洲欧美日韩综合俺去了| mm1313亚洲精品无码又大又粗| 中文字幕亚洲激情| 亚洲伦理一区二区| 久久精品国产亚洲AV忘忧草18 | 亚洲成a人片77777kkkk|