日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python中__new__和__init__的区别与联系

發(fā)布時(shí)間:2024/5/7 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中__new__和__init__的区别与联系 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

__new__和__init__的區(qū)別主要表現(xiàn)在:它自身的區(qū)別及在Python中新式類和老式類的定義。

__new__ 負(fù)責(zé)對(duì)象的創(chuàng)建而 __init__ 負(fù)責(zé)對(duì)象的初始化。

__new__:創(chuàng)建對(duì)象時(shí)調(diào)用,會(huì)返回當(dāng)前對(duì)象的一個(gè)實(shí)例
__init__:創(chuàng)建完對(duì)象后調(diào)用,對(duì)當(dāng)前對(duì)象的一些實(shí)例初始化,無(wú)返回值

1. 在類中,如果__new__和__init__同時(shí)存在,會(huì)優(yōu)先調(diào)用__new__
class ClsTest(object): def __init__(self): print("init") def __new__(cls,*args, **kwargs): print("new") ClsTest()

執(zhí)行結(jié)果出:

new
2. 如果__new__返回一個(gè)對(duì)象的實(shí)例,會(huì)隱式調(diào)用__init__
class ClsTest(object): def __init__(self): print ("init") def __new__(cls,*args, **kwargs): print ("new %s"%cls) return object.__new__(cls, *args, **kwargs) ClsTest()

執(zhí)行結(jié)果為:

new <class '__main__.ClsTest'> init
3. __new__方法會(huì)返回所構(gòu)造的對(duì)象,__init__無(wú)返回值。
class ClsTest(object): def __init__(cls): cls.x = 2 print ("init") return cls ClsTest()

執(zhí)行結(jié)果為:

init Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: __init__() should return None, not 'ClsTest'
4. 若__new__沒(méi)有正確返回當(dāng)前類cls的實(shí)例,那__init__是不會(huì)被調(diào)用的,即使是父類的實(shí)例也不行
class ClsTest1(object):passclass ClsTest2(ClsTest1):def __init__(self):print ("init")def __new__(cls,*args, **kwargs):print ("new %s"%cls)return object.__new__(ClsTest1, *args, **kwargs)b=ClsTest2() print (type(b))

執(zhí)行結(jié)果為:

new <class '__main__.ClsTest2'> <class '__main__.ClsTest1'>

知識(shí)點(diǎn)

  • 繼承自object的新式類才有__new__
  • __new__至少要有一個(gè)參數(shù)cls,代表要實(shí)例化的類,此參數(shù)在實(shí)例化時(shí)由Python解釋器自動(dòng)提供,__new__必須要有返回值,返回實(shí)例化出來(lái)的實(shí)例,可以return父類__new__出來(lái)的實(shí)例,或者直接是object的__new__出來(lái)的實(shí)例
  • __init__有一個(gè)參數(shù)self,就是這個(gè)__new__返回的實(shí)例,__init__在__new__的基礎(chǔ)上可以完成一些其它初始化的動(dòng)作,__init__不需要返回值
  • 如果__new__返回一個(gè)對(duì)象的實(shí)例,會(huì)隱式調(diào)用__init__
  • 總結(jié)

    以上是生活随笔為你收集整理的Python中__new__和__init__的区别与联系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。