1. 程式人生 > >python中new方法詳解。

python中new方法詳解。

new_ 方法是什麼?
__new__方法其實就是建立物件的方法
new()方法是在類準備將自身例項化時呼叫。
一個類可以有多個位置引數和多個命名引數,而在例項化開始之後,在呼叫 init()方法之前,Python首先呼叫new()方法:

def new(cls, *args, **kwargs):

第一個引數cls是當前正在例項化的類。
如果要得到當前類的例項,應當在當前類中的new()方法語句中呼叫當前類的父類 的new()方法。
例如,如果當前類是直接繼承自object,那當前類的new()方法返回的物件應該為:

def new(cls, *args, **kwargs):

return object.new

(cls)

通常來說,當前類開始例項化時,new()方法會返回cls(cls指代當前類)的例項,然後該類的
init()方法作為構造方法會接收這個例項(即self)作為自己的第一個引數,然後依次傳入new ()方法中接收的位置引數和命名引數。

注意:如果new()沒有返回cls(即當前類)的例項,那麼當前類的init()方法是不會被呼叫 的。
如果new()返回其他類的例項,那麼只會呼叫被返回的那個類的構造方 法。
class Foo(object):
def init(self, *args, **kwargs):
pass
def new(cls, *args, **kwargs):
return object.new

(Stranger, *args, **kwargs)

class Stranger(object):
pass

foo = Foo()
print(type(foo))
》》》》<class ‘main.Stranger’>

因此可以這麼描述new()和ini()的區別,在新式類中new()才是真正的例項化方法,為類提供外殼製造出例項框架,
然後呼叫該框架內的構造方法init()使其豐滿。
如果以建房子做比喻,new()方法負責開發地皮,打下地基,並將原料存放在工地。
而init()方法負責從工地取材料建造出地皮開發招標書中規定的大樓,init()負責大樓的細節設計,建造,裝修使其可交付給客戶。