c 中的new 類建構函式 new

2021-10-13 18:02:49 字數 695 閱讀 7611

我們都知道在例項化乙個類時會使用這個類的__init__方法,但是在真實情況中類的例項化是分成兩個階段的,第一階段是使用該類的__new__方法例項化乙個物件,第二階段才是使用物件的__init__方法進行初始化。由於很多時候,第乙個階段被我們忽略了,所以看起來例項化類時只使用了__init__方法。

既然在例項化類的過程中存在兩個階段,並且在第乙個階段會得到乙個物件,那麼可以說如果在__new__方法中修改了返回的物件,那麼就會徹底改變類的構造過程,會出現意想不到的情況。

既然類的構造過程包含兩個階段,那麼我們看看如何使用__new__方法控制例項化過程:

結果如下:

cat類時先執行了__new__方法,然後執行了__init__方法;在例項化wolf類時由於在__new__方法中返回了dog類例項,所以例項化的物件是dog,不是wolf

可能你會想__new__到底有什麼用呢?好像就是多幹了一點事,把這些事情直接放在__init__方法中不就好了。既然別人這麼發明、,那麼就是有目的的,就目前我所了解的,最重要的乙個用處是讓所有例項化的物件都是乙個物件,另外還可以防止繼承類有自己的例項,比如int類就不允許有繼承類。

建構函式使用new的類

如果類使用new運算子來分配類成員指向的記憶體,在設計時應採取一些預防措施 應牢記這些規則,這是因為編譯器並不知道這些規則,因此無法發現錯誤 對於指向的記憶體是由new分配的所有類成員,都應在類的析構函式中對其使用delete,該運算子將釋放分配的記憶體 如果析構函式通過對指標類成員使用delete...

new與建構函式

function cat name,age 機制1 每乙個函式物件都有乙個prototype物件 console.log cat.prototype node輸出 cat.prototype.get name function 機制2 new關鍵字 建構函式 step1 建立了乙個新的物件 該物件預...

VMM中各個類的建構函式 new的引數

vmm data的派生類的new函式中,只是用靜態的log去初始化訊息服務視窗和通知視窗。vmm data的stream id和transactor相關,因此stream id由transactor給出。同理,data id 由generator在每產生乙個產品的時侯increase。functio...