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__()方法還可以用來實現單例模式,也就是使每次實例化時只返回同一個實例對象。