成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何禁止 Python 子類覆蓋父類方法?

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

[[428429]]

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

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

先來看一下實現效果:

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

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

  1. def protect(*protected): 
  2.     """Returns a metaclass that protects all attributes given as strings""" 
  3.     class Protect(type): 
  4.         has_base = False 
  5.         def __new__(meta, name, bases, attrs): 
  6.             if meta.has_base: 
  7.                 for attribute in attrs: 
  8.                     if attribute in protected: 
  9.                         raise AttributeError('Overriding of attribute "%s" not allowed.'%attribute) 
  10.             meta.has_base = True 
  11.             klass = super().__new__(meta, name, bases, attrs) 
  12.             return klass 
  13.     return Protect 

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

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

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

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

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

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

參考文獻

[1] 9.13 使用元類控制實例的創建 — python3-cookbook 3.0.0 文檔: https://python3-cookbook.readthedocs.io/zh_CN/latest/c09/p13_using_mataclass_to_control_instance_creation.html

本文轉載自微信公眾號「未聞Code」,可以通過以下二維碼關注。轉載本文請聯系未聞Code公眾號。

 

責任編輯:武曉燕 來源: 未聞Code
相關推薦

2024-11-14 10:00:00

Python繼承

2021-10-11 20:02:49

Python父類方法

2009-12-16 09:43:35

Ruby父類Objec

2009-08-21 14:22:22

C# new和over

2009-09-09 11:28:40

Scala類

2023-08-08 08:01:52

Java程序變量

2010-03-18 14:16:52

Java Thread

2020-12-17 08:05:27

JavaSuper用法

2023-12-05 16:01:12

模板方法設計模式算法結構

2021-04-21 10:01:53

Python類方法靜態方法

2012-04-10 11:07:41

Java

2009-06-16 10:20:05

多繼承C#

2016-03-29 10:39:46

iOS函數初始化

2014-12-29 10:19:01

Java

2019-12-27 15:05:51

Python類方法裝飾器

2021-05-21 09:01:56

Python繼承多態

2020-05-26 08:52:36

Java JVM多態

2010-08-26 15:24:04

DHCP服務功能

2010-07-22 11:06:31

禁止Telnet 23

2009-12-10 13:37:16

PHP parent
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜视频在线免费观看 | 午夜黄色影院 | 99精品一区二区 | 91色综合 | 久久综合av | 免费在线观看一区二区三区 | 久久久av中文字幕 | 黄色免费网址大全 | 国产色片| 日韩av在线中文字幕 | 精品国产一区二区三区av片 | 国产精品一区久久久 | 日韩一区二区三区在线 | a黄毛片 | 精品动漫一区 | 7777精品伊人久久精品影视 | 美国一级片在线观看 | 久久久久久久久久久福利观看 | 欧美国产日韩一区二区三区 | 国产露脸国语对白在线 | 久草成人| 免费一级做a爰片久久毛片潮喷 | 久久99久久 | 国产精品永久免费 | 欧美在线一区二区三区 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美性受xxx | 日韩精品久久一区 | 日韩精品一区二区三区中文在线 | 亚洲五码久久 | 91亚洲国产成人精品一区二三 | 日本三级黄视频 | 国产亚洲精品精品国产亚洲综合 | 欧美日韩综合精品 | 久久国产精品免费一区二区三区 | 精品少妇一区二区三区日产乱码 | 在线观看电影av | www成人免费视频 | 欧美日韩中文字幕在线 | 欧美一区二区在线播放 | 欧美偷偷|