new() 是在新式類中新出現(xiàn)的方法,它作用在構(gòu)造方法建造實(shí)例之前涣狗,可以這么理解碑诉,在 Python 中存在于類里面的構(gòu)造方法 init() 負(fù)責(zé)將類的實(shí)例化携取,而在 init() 啟動(dòng)之前太示,new() 決定是否要使用該 init() 方法柠贤,因?yàn)?strong>new() 可以調(diào)用其他類的構(gòu)造方法或者直接返回別的對(duì)象來(lái)作為本類的實(shí)例。
如果將類比喻為工廠先匪,那么init()方法則是該工廠的生產(chǎn)工人种吸,init()方法接受的初始化參數(shù)則是生產(chǎn)所需原料弃衍,init()方法會(huì)按照方法中的語(yǔ)句負(fù)責(zé)將原料加工成實(shí)例以供工廠出貨呀非。而new()則是生產(chǎn)部經(jīng)理,new()方法可以決定是否將原料提供給該生產(chǎn)部工人镜盯,同時(shí)它還決定著出貨產(chǎn)品是否為該生產(chǎn)部的產(chǎn)品岸裙,因?yàn)檫@名經(jīng)理可以借該工廠的名義向客戶出售完全不是該工廠的產(chǎn)品。
init 和 new 最主要的區(qū)別在于:
1.init 通常用于初始化一個(gè)新實(shí)例速缆,控制這個(gè)初始化的過(guò)程降允,比如添加一些屬性, 做一些額外的操作艺糜,發(fā)生在類實(shí)例被創(chuàng)建完以后剧董。它是實(shí)例級(jí)別的方法。
2.new 通常用于控制生成一個(gè)新實(shí)例的過(guò)程破停。它是類級(jí)別的方法翅楼。
new() 方法的特性:
new() 方法是在類準(zhǔn)備將自身實(shí)例化時(shí)調(diào)用。
new() 方法始終都是類的靜態(tài)方法真慢,即使沒(méi)有被加上靜態(tài)方法裝飾器毅臊。
使用舉例
部分代碼在github中做了整理
https://github.com/jiaxiaolei/myspace/tree/master/study/python/new_init
擴(kuò)展閱讀
詳解Python中的init和new
https://my.oschina.net/liuyuantao/blog/747164
一個(gè)備份:
http://python.jobbole.com/86506/
簡(jiǎn)介:
解釋比較好。 參考文章內(nèi)容黑界,整理了代碼管嬉。還提到了“python中的metaclass和new的關(guān)系”
這樣便是init最普通的用法了。但init其實(shí)不是實(shí)例化一個(gè)類的時(shí)候第一個(gè)被調(diào)用 的方法朗鸠。當(dāng)使用 Persion(name, age) 這樣的表達(dá)式來(lái)實(shí)例化一個(gè)類時(shí)蚯撩,最先被調(diào)用的方法 其實(shí)是 new 方法。
事實(shí)上如果(新式)類中沒(méi)有重寫new()方法烛占,即在定義新式類時(shí)沒(méi)有重新定義new()時(shí)胎挎,Python默認(rèn)是調(diào)用該類的直接父類的new()方法來(lái)構(gòu)造該類的實(shí)例,如果該類的父類也沒(méi)有重寫new(),那么將一直按此規(guī)矩追溯至object的new()方法呀癣,因?yàn)閛bject是所有新式類的基類美浦。
[深入Python]new和init
http://www.cnblogs.com/tuzkee/p/3540293.html
簡(jiǎn)介:
[Python] Python 之 new() 方法與實(shí)例化
http://www.cnblogs.com/ifantastic/p/3175735.html