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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python中__new__和__init__的区别与联系

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

__new__和__init__的區別主要表現在:它自身的區別及在Python中新式類和老式類的定義。

__new__ 負責對象的創建而 __init__ 負責對象的初始化。

__new__:創建對象時調用,會返回當前對象的一個實例
__init__:創建完對象后調用,對當前對象的一些實例初始化,無返回值

1. 在類中,如果__new__和__init__同時存在,會優先調用__new__
class ClsTest(object): def __init__(self): print("init") def __new__(cls,*args, **kwargs): print("new") ClsTest()

執行結果出:

new
2. 如果__new__返回一個對象的實例,會隱式調用__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()

執行結果為:

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

執行結果為:

init Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: __init__() should return None, not 'ClsTest'
4. 若__new__沒有正確返回當前類cls的實例,那__init__是不會被調用的,即使是父類的實例也不行
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))

執行結果為:

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

知識點

  • 繼承自object的新式類才有__new__
  • __new__至少要有一個參數cls,代表要實例化的類,此參數在實例化時由Python解釋器自動提供,__new__必須要有返回值,返回實例化出來的實例,可以return父類__new__出來的實例,或者直接是object的__new__出來的實例
  • __init__有一個參數self,就是這個__new__返回的實例,__init__在__new__的基礎上可以完成一些其它初始化的動作,__init__不需要返回值
  • 如果__new__返回一個對象的實例,會隱式調用__init__
  • 總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。