new_ 方法是什么?
__new__方法其實(shí)就是創(chuàng)建對象的方法
new()方法是在類準(zhǔn)備將自身實(shí)例化時(shí)調(diào)用。
一個類可以有多個位置參數(shù)和多個命名參數(shù),而在實(shí)例化開始之后,在調(diào)用 init()方法之前,Python首先調(diào)用new()方法:
def new(cls, *args, **kwargs):…
第一個參數(shù)cls是當(dāng)前正在實(shí)例化的類。
如果要得到當(dāng)前類的實(shí)例,應(yīng)當(dāng)在當(dāng)前類中的new()方法語句中調(diào)用當(dāng)前類的父類 的new()方法。
例如,如果當(dāng)前類是直接繼承自object,那當(dāng)前類的new()方法返回的對象應(yīng)該為:
def new(cls, *args, **kwargs):…return object.new(cls)
通常來說,當(dāng)前類開始實(shí)例化時(shí),new()方法會返回cls(cls指代當(dāng)前類)的實(shí)例,然后該類的init()方法作為構(gòu)造方法會接收這個實(shí)例(即self)作為自己的第一個參數(shù),然后依次傳入new ()方法中接收的位置參數(shù)和命名參數(shù)。
注意:如果new()沒有返回cls(即當(dāng)前類)的實(shí)例,那么當(dāng)前類的init()方法是不會被調(diào)用的。
如果new()返回其他類的實(shí)例,那么只會調(diào)用被返回的那個類的構(gòu)造方法。
class Foo(object):def init(self, *args, **kwargs):passdef new(cls, *args, **kwargs):return object.new(Stranger, *args, **kwargs)
class Stranger(object):pass
foo = Foo()print(type(foo))》》》》<class ‘main.Stranger'>
因此可以這么描述new()和ini()的區(qū)別,在新式類中new()才是真正的實(shí)例化方法,為類提供外殼制造出實(shí)例框架,然后調(diào)用該框架內(nèi)的構(gòu)造方法init()使其豐滿。
如果以建房子做比喻,new()方法負(fù)責(zé)開發(fā)地皮,打下地基,并將原料存放在工地。
而init()方法負(fù)責(zé)從工地取材料建造出地皮開發(fā)招標(biāo)書中規(guī)定的大樓,init()負(fù)責(zé)大樓的細(xì)節(jié)設(shè)計(jì),建造,裝修使其可交付給客戶。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對武林站長站的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
新聞熱點(diǎn)
疑難解答
圖片精選