久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

【python小白】 問(wèn)關(guān)于__new__方法的作用的問(wèn)題

瀏覽:142日期:2022-06-27 14:17:37

問(wèn)題描述

代碼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é)果:【python小白】 問(wèn)關(guān)于__new__方法的作用的問(wèn)題

代碼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é)果:【python小白】 問(wèn)關(guān)于__new__方法的作用的問(wèn)題

代碼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é)果:

【python小白】 問(wèn)關(guān)于__new__方法的作用的問(wèn)題

我的問(wèn)題一:這三段代碼A,B,C為什么輸出的結(jié)果都不一樣,原理在于哪里呢?特別是代碼B和代碼C,為什么代碼C這一段,在B的基礎(chǔ)上加上了return,結(jié)果就比B多了一個(gè)init方法。我的問(wèn)題二:在給方法傳參數(shù)的時(shí)候self和cls 這兩個(gè)參數(shù)有啥區(qū)別?為什么__new__這個(gè)方法要的參數(shù)是cls而__init__方法要傳入的參數(shù)是self?

問(wèn)題解答

回答1:

首先得先明白一件事情: self和cls的區(qū)別, cls是代表這個(gè)類, slef是用來(lái)代表這個(gè)類的實(shí)例, 如果這個(gè)搞清楚, 就成功了一點(diǎn).

函數(shù)參數(shù)帶有self的, 可以理解成這個(gè)函數(shù), 是實(shí)例的方法, 是要和實(shí)例綁定的.

__new__方法, 是新式類用來(lái)創(chuàng)建實(shí)例使用的, 傳入的cls就是用來(lái)給object.__new__創(chuàng)建實(shí)例使用的參數(shù), 如果沒(méi)有傳入cls, object根本不知道創(chuàng)建什么樣的實(shí)例.

結(jié)合上面, 現(xiàn)在再來(lái)說(shuō)下三個(gè)輸出不同的原因:

為什么只有--new, 因?yàn)槊總€(gè)類在實(shí)例化對(duì)象時(shí), 都必須要調(diào)用這個(gè)__new__方法, 去創(chuàng)建實(shí)例, 所以它肯定會(huì)被調(diào)用, 但是因?yàn)樵摵瘮?shù)被你重寫了, 所以它只是打印了--new方法, 并沒(méi)有返回創(chuàng)建實(shí)例, 并且放回, 所以__del__也是不會(huì)發(fā)生

為什么只有--new和--del, 正如第1點(diǎn)說(shuō)的那樣, 但是這里確實(shí)__new___有創(chuàng)建新實(shí)例, 但是并沒(méi)有返回, 因?yàn)橹挥蟹祷亓? 該對(duì)象才能進(jìn)行下一步的__init__, 正因?yàn)檫@里只有創(chuàng)建, 沒(méi)有返回, 所以結(jié)果這樣

如果看懂前兩點(diǎn), 相信這個(gè)應(yīng)該沒(méi)啥問(wèn)題, 因?yàn)閯?chuàng)建了,并且返回了, 所以’__init__’也同樣被執(zhí)行了, 所有的東西都是像正常的行為那樣發(fā)生

最后想說(shuō)明: 為什么__del__會(huì)被執(zhí)行, 理論上, 這個(gè)只有在實(shí)例被del析構(gòu)時(shí), 才會(huì)執(zhí)行,這里并沒(méi)有del xtq類似的代碼, 為什么也會(huì)執(zhí)行, 原因就是, 程序結(jié)束了, 要退出了, 在執(zhí)行更底層的程序退出時(shí), python自發(fā)做的內(nèi)存回收, 所以一切塵歸塵土歸土, 創(chuàng)建的對(duì)象也被一一析構(gòu)

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 黔南| 广州市| 团风县| 西宁市| 阳东县| 通河县| 四川省| 金阳县| 奉节县| 襄垣县| 塔城市| 房产| 广平县| 泾阳县| 电白县| 井冈山市| 望城县| 安图县| 福安市| 中宁县| 渝北区| 四平市| 宽城| 明溪县| 慈利县| 永登县| 双鸭山市| 安塞县| 微博| 桐庐县| 连平县| 时尚| 句容市| 神木县| 昌都县| 古浪县| 尼勒克县| 嵊州市| 滦南县| 昌江| 哈密市|