【python小白】 問關(guān)于__new__方法的作用的問題
問題描述
代碼A:
# -*- coding:gb2312 -*-class Dog (object): def __init__(self):print('-----init方法-----') def __del__(self):print('-----del方法-----') def __str__(self):#print('-----str方法-----')return ('-----str方法-----') def __new__(cls):print('-----new方法-----')#return object.__new__(cls)xtq = Dog()
代碼A運(yùn)行結(jié)果:
代碼B:
# -*- coding:gb2312 -*-class Dog (object): def __init__(self):print('-----init方法-----') def __del__(self):print('-----del方法-----') def __str__(self):#print('-----str方法-----')return ('-----str方法-----') def __new__(cls):print('-----new方法-----')object.__new__(cls)xtq = Dog()
代碼B運(yùn)行結(jié)果:
代碼C:
# -*- coding:gb2312 -*-class Dog (object): def __init__(self):print('-----init方法-----') def __del__(self):print('-----del方法-----') def __str__(self):#print('-----str方法-----')return ('-----str方法-----') def __new__(cls):print('-----new方法-----')return object.__new__(cls)xtq = Dog()
代碼C運(yùn)行結(jié)果:
我的問題一:這三段代碼A,B,C為什么輸出的結(jié)果都不一樣,原理在于哪里呢?特別是代碼B和代碼C,為什么代碼C這一段,在B的基礎(chǔ)上加上了return,結(jié)果就比B多了一個init方法。我的問題二:在給方法傳參數(shù)的時候self和cls 這兩個參數(shù)有啥區(qū)別?為什么__new__這個方法要的參數(shù)是cls而__init__方法要傳入的參數(shù)是self?
問題解答
回答1:首先得先明白一件事情: self和cls的區(qū)別, cls是代表這個類, slef是用來代表這個類的實(shí)例, 如果這個搞清楚, 就成功了一點(diǎn).
函數(shù)參數(shù)帶有self的, 可以理解成這個函數(shù), 是實(shí)例的方法, 是要和實(shí)例綁定的.
__new__方法, 是新式類用來創(chuàng)建實(shí)例使用的, 傳入的cls就是用來給object.__new__創(chuàng)建實(shí)例使用的參數(shù), 如果沒有傳入cls, object根本不知道創(chuàng)建什么樣的實(shí)例.
結(jié)合上面, 現(xiàn)在再來說下三個輸出不同的原因:
為什么只有--new, 因?yàn)槊總€類在實(shí)例化對象時, 都必須要調(diào)用這個__new__方法, 去創(chuàng)建實(shí)例, 所以它肯定會被調(diào)用, 但是因?yàn)樵摵瘮?shù)被你重寫了, 所以它只是打印了--new方法, 并沒有返回創(chuàng)建實(shí)例, 并且放回, 所以__del__也是不會發(fā)生
為什么只有--new和--del, 正如第1點(diǎn)說的那樣, 但是這里確實(shí)__new___有創(chuàng)建新實(shí)例, 但是并沒有返回, 因?yàn)橹挥蟹祷亓? 該對象才能進(jìn)行下一步的__init__, 正因?yàn)檫@里只有創(chuàng)建, 沒有返回, 所以結(jié)果這樣
如果看懂前兩點(diǎn), 相信這個應(yīng)該沒啥問題, 因?yàn)閯?chuàng)建了,并且返回了, 所以’__init__’也同樣被執(zhí)行了, 所有的東西都是像正常的行為那樣發(fā)生
最后想說明: 為什么__del__會被執(zhí)行, 理論上, 這個只有在實(shí)例被del析構(gòu)時, 才會執(zhí)行,這里并沒有del xtq類似的代碼, 為什么也會執(zhí)行, 原因就是, 程序結(jié)束了, 要退出了, 在執(zhí)行更底層的程序退出時, python自發(fā)做的內(nèi)存回收, 所以一切塵歸塵土歸土, 創(chuàng)建的對象也被一一析構(gòu)
相關(guān)文章:
1. javascript - 微信報redirect_uri參數(shù)錯誤2. 我在centos容器里安裝docker,也就是在容器里安裝容器,報錯了?3. android - 類似微信朋友圈或者QQ空間說說那種點(diǎn)擊圖片放大,并且有放大縮小手勢,左右滑動圖片手勢效果4. java - 初學(xué)SSM 在import自己寫的包下的類的時候飄紅,求大神解答?5. 網(wǎng)頁動畫等過渡效果,CSS3 transitions 和 jQuery animations 誰實(shí)現(xiàn)的性能更好?6. javascript - 怎么簡寫這段jQuery功能?7. springboot中不能獲取post請求參數(shù)的解決方法8. javascript - 如何計(jì)算字符串寬度?9. java - Atom中文問題10. angular.js - angular中的a標(biāo)簽不起作用
