好嘞,今天我們繼續剖析下Python裡的類別。
#先前我們定義類別的時候,使用到了建構函數,在Python裡的建構子書寫比較特殊,他是個特殊的函數__init__,其實在類別裡,除了建構子還有很多其他格式為__XXX__的函數,另外也有一些__xx__的屬性。下面我們一一說下:
建構子

#Python裡所有類別的建構子都是__init__,其中根據我們的需求,構造函數又分為有參構造函數和無慘構造函數。如果目前沒有定義建構函數,那麼系統會自動產生一個無參空的建構函數。例如:

在有繼承關係的類別中,只要父類別被顯示定義,那麼子類別在建立的時候就會呼叫父類別的建構方法建立父類別對象,儘管子類別沒有從父類別繼承屬性,也會自動執行。例如:

如果子類別想從父類別繼承取得屬性,那麼需要顯示呼叫父類別的建構子才能獲取,否則只能取得父類別方法。例如:

這裡我們需要引入一個新的概念,即函數重載。在類別內部,如果存在多個函數名稱相同,函數參數不同(個數不同、類型不同、順序不同)那麼我們稱這幾個函數是重載函數,函數傳回值不作為重載的依據。在java和C 裡我們都有類似的概念。但是Python是動態程式語言,其資料沒有資料類型,因此在類別內部我們沒法進行函數重載,因此類別內部不能有同名的多個方法,所以我們的建構方法要么不寫,要么只能寫一個。如果不寫系統會自動產生一個空的無參構造方法;如果寫了,那麼只能呼叫該構造方法。另外我們在學習裝飾器的時候似乎在類別內部寫了幾個同名的方法,例如:

那麼這幾個同名方法就是重載關係嗎?不是的,因為他們不是完整的方法,他們一定更要加上@property、@name.setter、@name.deleter限制才是完整的,因此這裡不是函數重載。
析構函式
建構函式是在物件建立的時候被自動執行的,其主要職責是對物件進行初始化。析構函數則是在物件銷毀(執行del或被回收)的時候被自動執行的,其主要職責是對物件進行回收。先前我們沒有寫析構方法,那麼系統會自動產生一個空的析構函數。接下來我們就寫一個析構函數。 Python裡的析構方法名為__del__。例如:

我們這麼呼叫:

執行為

#在這裡我們要重點介紹python的垃圾回收機制。
現在程式設計師對系統的垃圾回收機制不是特別關注,因為現在硬體發展的很快,我們可用的資源很豐富,伺服器記憶體4G都是小的,可能大多是8G起步,不夠再加。但對於一些高階職位和高精產業,垃圾回收機制還是很重要的。所以我們在這裡梳理下python裡的垃圾回收機制。
Python裡的垃圾回收機制以引用數數為主。系統會為每個物件分配一個引用計數器,用來記錄目前物件被使用的次數。既然牽涉到計數,就有加和減的操作。系統規定,滿足下述條件進行計數器加1操作:
1.新建立一個物件
2.引用一個物件
3.物件作為實參傳遞。
滿足下述條件進行計數器減1操作:
#1.對該物件進行del操作
2.該物件的引用被賦新值
3.物件退出目前作用域(最常見的就是退出函數作用域)
在python裡,我們透過sys. getrefcount(物件名稱),來取得該物件的目前引用計數器,注意,首次這裡的參考計數不一定為1,因為有系統暫時引用。只有當指向物件的參考計數器變成0(首次的初始值)的時候,該物件才會真的被銷毀,而該物件的析構函數才會被執行。例如:

輸出為

#注意,上述第一次呼叫sys.getrefcount(ad )的時候的回傳值為4說明目前系統有其他的臨時用用,那麼我們最終只要到4了說明就回傳初始狀態了。最後delad的時候會將系統暫時引用也釋放。我們目前的運行環境是win pycharm。我們再改下程式碼:

#輸出為

從上述輸出可以看出,系統對基本資料型別似乎還有其他操作,造成其初始參考計數比我們預期的參考計數大。而引用資料型態資料則是完全在我們預期的。
只有最終釋放該物件的時候(引用計數為0的時候),__del__析構方法才會被執行。
__str__方法
先看我們的程式碼:

#輸出為

#我們列印該物件的時候,得到是該物件的記憶體位址,能不能像列印基本資料型別的資料一樣來列印我們的引用資料型別呢?比如說上述類別Student應該要列印他的實例變數啊。
我們現在提到的__str__方法就是要完成這個功能的,__str__方法有一個回傳值,這個回傳值就是我們執行print的時候的輸出值,因此我們可以在__str__方法內格式化輸出內容。例如:

輸出為

#從上面的輸出可以看出,我們想輸出格式化引用資料型別資料的時候,就要重寫該類別裡的__str__方法,該方法裡你可以設定目前內容的輸出內容。這個__str__方法是object類別的方法,因為python裡所有類別都是直接或間接從object衍生出來的,因此每個引用資料型別都有__str__方法。我們只需要重寫該方法覆蓋父類別的方法。否則系統會預設去呼叫object裡的__str__方法。
__dict__
可能有些人說了,我怎麼知道我的類別有哪些內建成員(屬性和方法)呢?比如說上面的__str_我壓根就不知道有這個方法,我怎麼呼叫?python類別裡確實有個屬性,可以列印出該類別的所有內建內容。即__dict__。注意這個__dict__是屬性不是方法,呼叫的時候不要加()

#輸出為

為何stu1.__dict__的輸出內容較少,而Student.__dict__的輸出內容較多呢?因為stu1是對象,對於對象來講,有意義的就是屬性,因為方法是所有對象共享的。而資料是自己特有的,執行的時候只需要攜帶目前的物件的位址就可以執行該類別的方法(即self)。而Student是一個類,類別是有屬性和方法組成的,所以Student.__dict__的輸出稍微多點,包括方法和屬性。
如果你想知道該類別的父類別有哪些內建成員,你就列印該類別的父類別的__dict__屬性即可。例如我們看下Student類別的父類別object有哪些內建成員,如下:

#Ojbect.__dict__的輸出稍微長些,自己列印看下吧,裡面一定有__str__的說明的。
好了,今天我們接觸到了__init__建構子、__del__析構函數、__str__內建函數、__dict__屬性等,明天我們繼續剖析物件導向裡的其他內建的成員。
以上是Python物件導向裡常見的內建成員介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

選擇Python還是C 取決於項目需求:1)如果需要快速開發、數據處理和原型設計,選擇Python;2)如果需要高性能、低延遲和接近硬件的控制,選擇C 。

通過每天投入2小時的Python學習,可以有效提升編程技能。 1.學習新知識:閱讀文檔或觀看教程。 2.實踐:編寫代碼和完成練習。 3.複習:鞏固所學內容。 4.項目實踐:應用所學於實際項目中。這樣的結構化學習計劃能幫助你係統掌握Python並實現職業目標。

在兩小時內高效學習Python的方法包括:1.回顧基礎知識,確保熟悉Python的安裝和基本語法;2.理解Python的核心概念,如變量、列表、函數等;3.通過使用示例掌握基本和高級用法;4.學習常見錯誤與調試技巧;5.應用性能優化與最佳實踐,如使用列表推導式和遵循PEP8風格指南。

Python適合初學者和數據科學,C 適用於系統編程和遊戲開發。 1.Python簡潔易用,適用於數據科學和Web開發。 2.C 提供高性能和控制力,適用於遊戲開發和系統編程。選擇應基於項目需求和個人興趣。

Python更適合數據科學和快速開發,C 更適合高性能和系統編程。 1.Python語法簡潔,易於學習,適用於數據處理和科學計算。 2.C 語法複雜,但性能優越,常用於遊戲開發和系統編程。

每天投入兩小時學習Python是可行的。 1.學習新知識:用一小時學習新概念,如列表和字典。 2.實踐和練習:用一小時進行編程練習,如編寫小程序。通過合理規劃和堅持不懈,你可以在短時間內掌握Python的核心概念。

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版
SublimeText3 Linux最新版

WebStorm Mac版
好用的JavaScript開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),