在寫Python類時,或者看某些項目源碼時,總是見到__init__
和__new__
方法,一直沒有深入研究兩者的區別,今天聊聊這個。
__new__
__new__
是類(class)方法。
class新創建實例時,會調用__new__
,它主要控制一個新實例的創建。
需要知道的是,__new__
是實例創建的第一步。首先調用它,再由它負責返回類的新實例。
通常,__new__
除非您要繼承不可變類型(如str,int,unicode或tuple),否則不必重寫。
針對__new__
的用法,舉個栗子:
依照Python官方文檔的說法,__new__方法主要是當你繼承一些不可變的class時(比如int, str, tuple), 提供給你一個自定義這些類的實例化過程的途徑。還有就是實現自定義的metaclass。
首先我們來看一下第一個功能,具體我們可以用int來作為一個例子:假如我們需要一個永遠都是正數的整數類型,通過集成 int,我們可能會寫出這樣的代碼。
但運行后會發現,結果根本不是我們想的那樣,我們任然得到了-3。
這是因為對於int這種 不可變的對象,我們只有重載它的__new__方法才能起到自定義的作用。這是修改后的代碼:
通過重載__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小站