先上代碼 python
其中,__new__()不是必定要有,只有繼承自object的類纔有,該方法能夠return父類(經過super(當前類名, cls).__new__())出來的實例,或者直接是object的__new__出來的實例。值得注意的是,在定義子類時沒有從新定義__new__()時,Python默認調用該類父類的__new__()方法來構造該類實例,若是該類父類也沒有重寫__new__(),那麼將一直追溯至object的__new__()方法,由於object是全部新式類的基類。若是子類中重寫了__new__()方法,那麼能夠自由選擇任意一個其餘的新式類。函數
可見,當類中同時出現__new__()和__init__()時,先調用__new__(),再調用__init__(),具體的執行過程爲:spa
1. 調用實例對象代碼xiaoming = Student('xiaoming',175);對象
2. 傳入name和height的參數,執行Student類的__new__()方法,該方法返回一個類的實例,一般會用父類super(Student,cls).__new__(cls),__new__()產生的實例即__init__()的self;blog
3. 用實例來調用__init__()方法,進行初始化實例對象的操做。繼承
能夠看到,python中__new__()與__init__()的區別,it
1.首先用法不一樣,__new__()用於建立實例,因此該方法是在實例建立以前被調用,它是類級別的方法,是個靜態方法;class
而 __init__() 用於初始化實例,因此該方法是在實例對象建立後被調用,它是實例級別的方法,用於設置對象屬性的一些初始值。基礎
由此可知,__new__()在__init__() 以前被調用。若是__new__() 建立的是當前類的實例,會自動調用__init__()函數,經過return調用的__new__()的參數cls來保證是當前類實例,若是是其餘類的類名,那麼建立返回的是其餘類實例,就不會調用當前類的__init__()函數。object
2.其次傳入參數不一樣
__new__()至少有一個參數cls,表明當前類,此參數在實例化時由Python解釋器自動識別;
__init__()至少有一個參數self,就是這個__new__()返回的實例,__init__()在__new__()的基礎上完成一些初始化的操做。
3.返回值不一樣
__new__()必須有返回值,返回實例對象;
__init__()不須要返回值。
另外談談__new__()的做用,__new__()方法主要用於繼承一些不可變的class,好比int, str, tuple, 提供一個自定義這些類的實例化過程的途徑,通常經過重載__new__()方法來實現。代碼以下
另外__new__()方法還能夠用來實現單例模式,也就是使每次實例化時只返回同一個實例對象。