1. 程式人生 > >python __init__() 和__new__()簡析

python __init__() 和__new__()簡析

先看下面一個例子:

如上圖,例1中,構造了函式Foo,並重寫了__new__()和__init__()方法,在例項化Foo()的時候,卻只調用了__new__()

例2中,在例項化Too()物件時,同時呼叫了__new__()和__init__()方法。

 

例項化物件的本質都是三個過程:建立例項物件,初始化例項物件和返回例項化物件

上面函式的__new__()方式,實際上就是在建立例項化物件,它有一個必傳的引數,cls:cls是當前正在例項化的類。

而__init__()則是在初始化例項物件。

在開始例項化物件時,程式會呼叫__new__()方法返回cls(當前類的例項),程式在接收到__new__()返回的例項後,呼叫__init__()方法初始化例項物件。注意,__new__()如果沒有當前類的例項,那麼__init__()方法不會被呼叫(如上圖1)。

這裡__new__()返回的例項cls將作為引數傳遞給__init__()方法,即self。

__new__()方法中,cls可以是當前例項化物件,也可以是其他類的例項,如果是其他類的例項,那麼只會呼叫被返回的那個類的構建方法。