在寫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小站
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/88136.html
標籤:Python
