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

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

Python函數(shù)__new__及__init__作用及區(qū)別解析

瀏覽:98日期:2022-07-12 17:40:09

【同】

二者均是Python面向?qū)ο笳Z(yǔ)言中的函數(shù),__new__比較少用,__init__則用的比較多。

【異】

__new__是在實(shí)例創(chuàng)建之前被調(diào)用的,因?yàn)樗娜蝿?wù)就是創(chuàng)建實(shí)例然后返回該實(shí)例對(duì)象,是個(gè)靜態(tài)方法。__init__是當(dāng)實(shí)例對(duì)象創(chuàng)建完成后被調(diào)用的,然后設(shè)置對(duì)象屬性的一些初始值,通常用在初始化一個(gè)類(lèi)實(shí)例的時(shí)候。是一個(gè)實(shí)例方法。

也就是:__new__先被調(diào)用,__init__后被調(diào)用,__new__的返回值(實(shí)例)將傳遞給__init__方法的第一個(gè)參數(shù),然后__init__給這個(gè)實(shí)例設(shè)置一些參數(shù)。

Python函數(shù)__new__及__init__作用及區(qū)別解析

===》》》Python函數(shù)__new__及__init__作用及區(qū)別解析

【一些說(shuō)明】

1、繼承自object的新式類(lèi)才有__new__

2、__new__至少要有一個(gè)參數(shù)cls,代表當(dāng)前類(lèi),此參數(shù)在實(shí)例化時(shí)由Python解釋器自動(dòng)識(shí)別

3、__new__必須要有返回值,返回實(shí)例化出來(lái)的實(shí)例,這點(diǎn)在自己實(shí)現(xiàn)__new__時(shí)要特別注意,可以return父類(lèi)(通過(guò)super(當(dāng)前類(lèi)名, cls))__new__出來(lái)的實(shí)例,或者直接是object的__new__出來(lái)的實(shí)例

4、__init__有一個(gè)參數(shù)self,就是這個(gè)__new__返回的實(shí)例,__init__在__new__的基礎(chǔ)上可以完成一些其它初始化的動(dòng)作,__init__不需要返回值

5、如果__new__創(chuàng)建的是當(dāng)前類(lèi)的實(shí)例,會(huì)自動(dòng)調(diào)用__init__函數(shù),通過(guò)return語(yǔ)句里面調(diào)用的__new__函數(shù)的第一個(gè)參數(shù)是 cls 來(lái)保證是當(dāng)前類(lèi)實(shí)例,如果是其他類(lèi)的類(lèi)名,;那么實(shí)際創(chuàng)建返回的就是其他類(lèi)的實(shí)例,其實(shí)就不會(huì)調(diào)用當(dāng)前類(lèi)的__init__函數(shù),也不會(huì)調(diào)用其他類(lèi)的__init__函數(shù)。

6、在定義子類(lèi)時(shí)沒(méi)有重新定義__new__()時(shí),Python默認(rèn)是調(diào)用該類(lèi)的直接父類(lèi)的__new__()方法來(lái)構(gòu)造該類(lèi)的實(shí)例,如果該類(lèi)的父類(lèi)也沒(méi)有重寫(xiě)__new__(),那么將一直按此規(guī)矩追溯至object的__new__()方法,因?yàn)閛bject是所有新式類(lèi)的基類(lèi)。

7、而如果子類(lèi)中重寫(xiě)了__new__()方法,那么你可以自由選擇任意一個(gè)的其他的新式類(lèi)(必定要是新式類(lèi),只有新式類(lèi)必定都有__new__(),因?yàn)樗行率筋?lèi)都是object的后代,而經(jīng)典類(lèi)則沒(méi)有__new__()方法)的__new__()方法來(lái)制造實(shí)例,包括這個(gè)新式類(lèi)的所有前代類(lèi)和后代類(lèi),只要它們不會(huì)造成遞歸死循環(huán)。反正肯定不能調(diào)用自己的__new__,這肯定是死循環(huán)。

8、對(duì)于子類(lèi)的__init__,其調(diào)用規(guī)則跟__new__是一致的,當(dāng)然如果子類(lèi)和父類(lèi)的__init__函數(shù)都想調(diào)用,可以在子類(lèi)的__init__函數(shù)中加入對(duì)父類(lèi)__init__函數(shù)的調(diào)用。

9、我們?cè)谑褂脮r(shí),盡量使用__init__函數(shù),不要去自定義__new__函數(shù),因?yàn)檫@兩者在繼承派生時(shí)的特性還是很不一樣的。

10、將類(lèi)比作制造商,__new__方法就是前期的原材料購(gòu)買(mǎi)環(huán)節(jié),__init__方法就是在有原材料的基礎(chǔ)上,加工,初始化商品環(huán)節(jié)

【__init__方法】

Python函數(shù)__new__及__init__作用及區(qū)別解析

【__new__方法】

__new__方法接受的參數(shù)雖然也是和__init__一樣,但__init__是在類(lèi)實(shí)例創(chuàng)建之后調(diào)用,而 __new__方法正是創(chuàng)建這個(gè)類(lèi)實(shí)例的方法。

Python函數(shù)__new__及__init__作用及區(qū)別解析 ===》Python函數(shù)__new__及__init__作用及區(qū)別解析

具體的執(zhí)行邏輯:

1. p = Person(name, age)

2. 首先執(zhí)行使用name和age參數(shù)來(lái)執(zhí)行Person類(lèi)的__new__方法,這個(gè)__new__方法會(huì)返回Person類(lèi)的一個(gè)實(shí)例(通常情況下是使用 super(Persion, cls).__new__(cls, ... ...) 這樣的方式),

3. 然后利用這個(gè)實(shí)例來(lái)調(diào)用類(lèi)的__init__方法,上一步里面__new__產(chǎn)生的實(shí)例也就是 __init__里面的的 self。

所以,__init__ 和 __new__ 最主要的區(qū)別在于:

1.__init__ 通常用于初始化一個(gè)新實(shí)例,控制這個(gè)初始化的過(guò)程,比如添加一些屬性, 做一些額外的操作,發(fā)生在類(lèi)實(shí)例被創(chuàng)建完以后。它是實(shí)例級(jí)別的方法。

2.__new__ 通常用于控制生成一個(gè)新實(shí)例的過(guò)程。它是類(lèi)級(jí)別的方法。

【__new__的作用】

依照Python官方文檔的說(shuō)法,__new__方法主要是當(dāng)你繼承一些不可變的class時(shí)(比如int, str, tuple), 提供給你一個(gè)自定義這些類(lèi)的實(shí)例化過(guò)程的途徑。還有就是實(shí)現(xiàn)自定義的metaclass。

首先我們來(lái)看一下第一個(gè)功能,具體我們可以用int來(lái)作為一個(gè)例子:

假如我們需要一個(gè)永遠(yuǎn)都是正數(shù)的整數(shù)類(lèi)型,通過(guò)集成 int,我們可能會(huì)寫(xiě)出這樣的代碼。

Python函數(shù)__new__及__init__作用及區(qū)別解析

但運(yùn)行后會(huì)發(fā)現(xiàn),結(jié)果根本不是我們想的那樣,我們?nèi)稳坏玫搅?3。這是因?yàn)閷?duì)于int這種 不可變的對(duì)象,我們只有重載它的__new__方法才能起到自定義的作用。

這是修改后的代碼:

Python函數(shù)__new__及__init__作用及區(qū)別解析

通過(guò)重載__new__方法,我們實(shí)現(xiàn)了需要的功能。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 肇州县| 南城县| 沁水县| 平远县| 三原县| 农安县| 宁都县| 临海市| 长治县| 朝阳市| 荃湾区| 云林县| 隆回县| 乌拉特中旗| 宁武县| 通道| 安阳县| 时尚| 商水县| 朝阳县| 柘荣县| 镇安县| 瓦房店市| 图们市| 万山特区| 苏州市| 永顺县| 合阳县| 富民县| 潜江市| 浪卡子县| 肃宁县| 深圳市| 禹城市| 鄄城县| 淮安市| 裕民县| 离岛区| 丹寨县| 长葛市| 彭水|