雙繼承_在Python中使用雙下劃線防止類屬性被覆蓋!

在使用Python編寫面向對象的代碼時,我們會常常使用“繼承”這種開發方式。例如下面這一段代碼:

class Info:def __init__(self):passdef calc_age(self):print('我是父類的方法')
class PeopleInfo(Info):def __init__(self):super().__init__()def calc_age(self):print(123456)
復制代碼

如果你使用 PeopleInfo 初始化一個對象,然后調用這個類的 calc_age 方法,我們來看看運行效果,如下圖所示:

Python學習交流群:1004391443

8e2abba4b28921ebb467390a0fec16d7.png

可以看出,父類 Info 里面的 calc_age 被子類里面的 calc_age 給“覆蓋”了。

到目前為止,應該都是你已經知道的東西。那么下一個問題,請問 PeopleInfo 里面的 __init__ 會不會覆蓋 Info 里面的 __init__ ?

為了確認這一點,我們來測試一下:

class Info:def __init__(self):print('我是父類的__init__')def calc_age(self):print('我是父類的方法')
class PeopleInfo(Info):def __init__(self):super().__init__()print('我是之類的初始化方法')def calc_age(self):print(123456)
復制代碼

運行效果如下圖所示:

729b0f8c52485009aa1547d8d65243f9.png

這里你發現父類和子類的 __init__ 都被運行了。

不過你可能會強行解釋為:在子類的 __init__ 里面,有一行 super().__init__() ,這個地方可能子類還沒有完全覆蓋父類,所以先運行了父類的方法。等到子類的 __init__ 全部執行完成以后,才會覆蓋父類。

當然,這種強行詭辯顯然是錯誤的,但為了證明這里你看到的現象和這個 super().__init__() 沒有任何關系,我們不使用 __init__ ,而是自己定義一個:

class Info:def __init__(self):passdef __calc_age(self):print('我是父類的方法')def run_father(self):self.__calc_age()
class PeopleInfo(Info):def __init__(self):super().__init__()passdef __calc_age(self):print(123456)def run_son(self):self.__calc_age()
復制代碼

運行效果如下圖所示:

cf0c359a0f2ae871003e188bda68217c.png

從這里可以看出,父類和子類的 __calc_age 都成功運行了。

這是因為,在Python里面,類方法或者屬性如果以雙下劃線開頭,那么他們就是類的私有方法,在被繼承的時候,即使子類有相同名字的以雙下劃線開頭的屬性或者方法也不會覆蓋父類。

而且這些以雙下劃線開頭的私有方法或者屬性,在類內部可以自由被其他方法調用,但是在實例對象里面是不能直接調用的,如下圖所示:

c8c54f6cd6efdfe8d9000c501af4d19a.png

那么Python是如何實現這一點的呢?實際上Python僅僅是改了一個名字而已。我們使用 dir 函數看看實例對象 kingname 里面有哪些內容,如下圖所示:

ec607756887d90a5d49be8c1e04ae76c.png

大家請注意方框框住的內容,其中的 _Info__calc_age 就是父類中的 __calc_age ,而 _PeopleInfo__calc_age 就是子類中的 __calc_age 。Python僅僅是改了一個名字,在這種雙下劃線的私有方法或者私有屬性的前面加上了 _類名 ,這樣就確保了子類和父類的方法名不一致。

所以,雖然 在規范上,這種雙下劃線的私有方法和私有屬性是不應該在外部訪問的 ,但是如果你想強行訪問,可以個使用這種改名以后的名字:

kingname = PeopleInfo()
kingname._PeopleInfo__calc_age()  # 強行調用子類的私有方法
kingname._Info__calc_age()  # 強行調用父類的私有方法
復制代碼

運行效果如下圖所示:

49f8cd5a6ab40bde6feec4af2adab64d.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532926.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532926.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532926.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云服務器 自有操作系統,云服務器 自有操作系統

云服務器 自有操作系統 內容精選換一換監控是保持云耀云服務器可靠性、可用性和性能的重要部分,通過監控,用戶可以觀察云耀云服務器資源。為使用戶更好地掌握自己的云耀云服務器運行狀態,公有云平臺提供了云監控。您可以使用該服務監控您的云…

分割線不顯示_90后都30歲了,為什么還不結婚

2020年中國第一批90后已經30歲了。在傳統觀念里,30歲作為人生的分水嶺,成家,立業,結婚,生子,通通要在這之前解決掉,才算趕上了,人生的進度條,然而媒體針對90后&#xff0…

點到線段的距離_直線垂直,垂線的性質,點到直線的距離

歡迎關注公z號:沈陽奧數兩條直線相交所成的四個角中,有一個角是直角時,就說這兩條直線互相垂直,其中一條直線叫做另一條直線的垂線,它們的交點叫垂足。如圖,直線AB與CD垂直于點E,記作&#xff1…

rasa算法_(十八)基于RASA開始中文機器人實現機制

前文介紹了基于RASA的總體架構,本文著重介紹一下實現細節。機器人管理概述框架是多租戶SAAS系統,每個用戶可以創建多個機器人,每個機器人關聯獨立的語料庫,機器人能力,話術流程,在RASA中對應一個RASA運行實…

distinct返回null報錯_C#之集合常用擴展方法與Linq

一、集合的常用擴展方法(lambda的方式)1.Where() 根據條件選擇數據2.Select() 根據數據條件轉換成新的數據類型,類似于DTO轉換類3.Max() 根據條件選擇最大值4.Min() 根據條件選擇最小值5.OrderBy() 根據條件升序排序如果升序中Id都為1,那么就根據第二個條…

python tts 保存_Python 文件和目錄操作學習

文件與文件路徑文件有兩個關鍵屬性:文件名和路徑。路徑指明了文件在計算機上的位置。文件名中,最后一個句點之后的部分稱為文件的“擴展名”,它指出了文件的類型目錄也叫文件夾,文件夾可以包含文件和其他文件夾路徑分隔符在 Windo…

圖片 過度曝光_解讀:攝影初學者,如何理性處理“曝光不足”與“曝光過度”...

曝光是攝影的基本要素之一,但是許多攝影初學者在曝光不足和過度曝光的問題上經常會遇到很多的困擾,甚至完全不知道如何處理這些問題。其實知道如何獲得正確的曝光,并不是你了解曝光過度和曝光不足照片區別的唯一原因。因為創造性的表達比技術…

win7電腦誤刪鼠標鍵盤驅動_鼠標鍵盤,教您怎么解決鍵盤和鼠標失靈的問題

有的時候在我們使用電腦的過程中會突然間有鍵盤鼠標失靈的情況發生,而我們都是不明所以、不知所措的。對此,小編我給你們找了解決方法。接下來,就讓我們一起往下看看關于鍵盤鼠標失靈的解決方法吧。鍵盤和鼠標都是電腦的重要組成部分&#xf…

airpods刪除別人的配對_怎么不讓別人連我的airpods

airpods很容易就被朋友拿混了,到時候分不清自己的airpods耳機是一件很尷尬的事情。那么,airpods如何避免和別人混拿?不拿出來是最好的解決辦法,也可以提前設置不讓別人連我的airpods,這樣是最靠譜的方法。怎么不讓別人…

jmeter安裝包雙擊沒反應_windows環境下Jmeter5.2的安裝使用

標簽:target 首頁 環境變量 百度搜索 bsp nbsp htm targe oracl一、安裝配置JDKJmeter5.2依賴JDK1.8 版本,JDK安裝百度搜索JAVA下載JDK,地址:https://www.oracle.com/technetwork/java/javase/downloads/index.ht…

php把中文寫入mysql_php寫入mysql中文亂碼的實例解決方法

php寫入mysql出現中文亂碼的解決辦法是:在建立數據庫連接之后,將該連接的編碼方式改為中文。代碼如下:$linkIDmysql_connect("localhost","root","admin");if(!$linkID){echo "數據庫連接失敗&#xff01…

mysql 導入.sql文件_MySQL導入.sql文件及常用命令

MySQL導入.sql文件及常用命令在MySQL Qurey Brower中直接導入*.sql腳本,是不能一次執行多條sql命令的,在mysql中執行sql文件的命令:mysql> source d:/myprogram/database/db.sql;另附mysql常用命令:一) 連接MYSQL&#xff…

mysql ubuntu 17.04_1、mysql 5.7 ubuntu17.04

系統:ubuntu17.04數據庫主要分文檔型和服務型兩類:文檔型:如sqlite3 (17.04自帶/usr/bin/sqlite3)就是一個文件,應用在移動端如手機,pad,家電等服務型:如mysql有服務端(存儲數據)和客戶端mysql數…

mysql 查詢倒數第二條記錄_MySQL查詢倒數第二條記錄實現方法

有時候會用到查詢倒數第二條記錄lastHolderChangeHistory.find_by_sql([" SELECT * FROM holder_change_historieswhere treasure_id ?order by id desclimit 1,1 ",hch.treasure_id])select *from tablename awhere (select count(*)f…

kafka和mysql內存機制_一文五分鐘讓你徹底理解Kafka架構原理

對于kafka的架構原理我們先提出幾個問題?1.Kafka的topic和分區內部是如何存儲的,有什么特點?2.與傳統的消息系統相比,Kafka的消費模型有什么優點?3.Kafka如何實現分布式的數據存儲與數據讀取?一、Kafka架構圖1.kafka名詞解釋在一套kafka架構中有多個P…

centos mysql 互為主從_centos7 mysql互為主從+keepalived

一、互為主從配置1.1、資源情況192.168.11.177 server1192.168.11.180 server2192.168.11.210 VIP1.2、server1配置# vi /etc/my.cnf[mysqld]server-id1log-binmysql-binrelay_logmysql-realy-binrelay_log_indexslave-mysql-realy-bin.indexexpire_logs_days15binlog_formatmi…

手機apk簽名工具安卓版_小飛魚APK簽名工具使用方法

小飛魚APK簽名工具是小飛魚旗下的一款APK簽名軟件。是移動開發者必備的一款軟件。使用方法1、雙擊運行小飛魚APK簽名工具.exe文件,出現如下界面:2、點擊“功能”,沒有簽名證書的選擇證書制作,制作完證書再選擇APK簽名,有證書的直接…

React 路由傳參

引言 在上一篇中&#xff0c;我們學習了 React 中使用路由技術&#xff0c;以及如何使用 MyNavLink 去優化使用路由時的代碼冗余的情況。 這一節我們繼續上一篇 React 路由進行一些補充 1. Switch 解決相同路徑問題 首先我們看一段這樣的代碼 <Route path"/home&q…

mysql 5.5 client 字符集_rhel4 mysql5.5 字符集_character set

和oracle字符集一樣,有些暈,太細了小結:1,字符集分為:服務器,數據庫,表,連接,列等對應參數為:mysql> show variables like chara%;------------------------------------------------------| Variable_name | Value |---------------------…

mysql heartbeat lvs_mysql+heartbeat+DRBD+LVS實現mysql高可用二

上一節&#xff0c;講述了DRBD的安裝&#xff0c;因為要利用heartbeatDRBDmysql實現mysql的高可用&#xff0c;所以這一節講述安裝mysql和heartbeat的安裝分別在各個節點安裝mysql&#xff0c;文本使用的是二進制的安裝包mysql-5.5.33-linux2.6-x86_64.tar.gz[rootdrbd1 usr]# …