_new_()與_init_()的區別


  先上代碼 

    其中,__new__()不是一定要有,只有繼承自object的類才有,該方法可以return父類(通過super(當前類名, cls).__new__())出來的實例,或者直接是object的__new__出來的實例。值得注意的是,在定義子類時沒有重新定義__new__()時,Python默認調用該類父類的__new__()方法來構造該類實例,如果該類父類也沒有重寫__new__(),那么將一直追溯至object的__new__()方法,因為object是所有新式類的基類。如果子類中重寫了__new__()方法,那么可以自由選擇任意一個其他的新式類。

  可見,當類中同時出現__new__()和__init__()時,先調用__new__(),再調用__init__(),具體的執行過程為:

  1. 調用實例對象代碼xiaoming = Student('xiaoming',175);

  2. 傳入name和height的參數,執行Student類的__new__()方法,該方法返回一個類的實例,通常會用父類super(Student,cls).__new__(cls),__new__()產生的實例即__init__()的self;

  3. 用實例來調用__init__()方法,進行初始化實例對象的操作。

  可以看到,python中__new__()與__init__()的區別,

  1.首先用法不同,__new__()用於創建實例,所以該方法是在實例創建之前被調用,它是類級別的方法,是個靜態方法;

            而 __init__() 用於初始化實例,所以該方法是在實例對象創建后被調用,它是實例級別的方法,用於設置對象屬性的一些初始值。

  由此可知,__new__()在__init__() 之前被調用。如果__new__() 創建的是當前類的實例,會自動調用__init__()函數,通過return調用的__new__()的參數cls來保證是當前類實例,如果是其他類的類名,那么創建返回的是其他類實例,就不會調用當前類的__init__()函數。

 

  2.其次傳入參數不同

  __new__()至少有一個參數cls,代表當前類,此參數在實例化時由Python解釋器自動識別;

  __init__()至少有一個參數self,就是這個__new__()返回的實例,__init__()在__new__()的基礎上完成一些初始化的操作。

 

  3.返回值不同

  __new__()必須有返回值,返回實例對象;

  __init__()不需要返回值。

  

  另外談談__new__()的作用,__new__()方法主要用於繼承一些不可變的class,比如int, str, tuple, 提供一個自定義這些類的實例化過程的途徑,一般通過重載__new__()方法來實現。代碼如下

  另外__new__()方法還可以用來實現單例模式,也就是使每次實例化時只返回同一個實例對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM