Python類中的__new__和__init__的區別


在寫Python類時,或者看某些項目源碼時,總是見到__init____new__方法,一直沒有深入研究兩者的區別,今天聊聊這個。

__new__

__new__是類(class)方法。

class新創建實例時,會調用__new__,它主要控制一個新實例的創建。

需要知道的是,__new__是實例創建的第一步。首先調用它,再由它負責返回類的新實例。

通常,__new__除非您要繼承不可變類型(如str,int,unicode或tuple),否則不必重寫。

針對__new__的用法,舉個栗子:

依照Python官方文檔的說法,__new__方法主要是當你繼承一些不可變的class時(比如int, str, tuple), 提供給你一個自定義這些類的實例化過程的途徑。還有就是實現自定義的metaclass。

首先我們來看一下第一個功能,具體我們可以用int來作為一個例子:假如我們需要一個永遠都是正數的整數類型,通過集成 int,我們可能會寫出這樣的代碼。

69f9bc49f19a866f75e35bc6ed8ee09e.png

但運行后會發現,結果根本不是我們想的那樣,我們任然得到了-3。
這是因為對於int這種 不可變的對象,我們只有重載它的__new__方法才能起到自定義的作用。這是修改后的代碼:
3da6c8cf37ec9e6f18512fbeb31bc712.png
通過重載__new__方法,我們實現了需要的功能。

__init__

__init__是實例方法。

class調用__init__時,是對這個class生成的新實例初始化,初始化的內容,就是__init__內定義的內容。

每新創建一個實例,實例都會初始化這些內容,這些內容都是初始化給新創建的實例,跟class無關。

__init__不返回任何東西。創建實例后,它僅負責初始化實例,且僅在需要初始化某些內容時,才會進行調用。

參考文檔:
https://stackoverflow.com/questions/674304/why-is-init-always-called-after-new
https://www.cnblogs.com/shenxiaolin/p/9307496.html
本文首發於BigYoung小站


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM