您好,登錄后才能下訂單哦!
這篇文章主要講解了“Python的__Init__ 和__New__有什么區別”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python的__Init__ 和__New__有什么區別”吧!
__init__(self): 這個方法我們相對較熟悉,他是python 類中默認的初始化方法,即一個類實例化時,就會執行的方法。
__new__ 方法重寫非常固定,通常如下:
def __new__(cls): return super().__new__(cls)
其中cls 代表類本身。
重寫__new__方法的代碼非常固定:重寫__new__方法一定要return super().__new__(cls),或者return object.__new__(cls)否則python解釋器會得不到分配了空間的對象引用,就不會調用對象的初始化方法。例如:
class Mycls: def __new__(cls): print('new') return super().__new__(cls) def __init__(self): print('init') my=Mycls()
輸出:
new
init
我們可以看到new 在init之前輸出,證明__new__(cls)在__init__(self)之前執行。
我們重寫代碼:
def __new__(cls): print('new') my=Mycls() print(my)
輸出:
new
None
可以看到如果__new__(cls):中沒有返回值,不會返回實例,__init__(self)將不會執行。
1.__new__()方法用于創建實例,類實例化之前會首先調用,它是class的方法,是個靜態方法。而__init__()方法用戶初始化實例,該方法用在實例對象創建后被調用,它是實例對象的方法,用于設置類實例對象的一些初始值。
2.如果類中同時出現了__init__()方法和__new__()方法,則先調用__new__()方法后調用__init__()方法。__new__()方法是創建實例的第一步,執行完了需要返回創建的類的實例,否則則報錯,無法執行__init__()方法。其中,__init__()方法將不返回任何信息。
有的同學會問 用__new__來實現什么東東呢?
個人覺得,單例就是一個最經典的應用。單例模式(Singleton Pattern)是一種常用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當我們希望在整個系統中,某個類只能出現一個實例時,單例對象就能派上用場。例如,一個系統中可以存在多個打印任務,但是只能有一個正在工作的任務;一個系統只能有一個窗口管理器或文件系統;一個系統只能有一個計時工具或ID(序號)生成器。
具體實現代碼如下:
class Mycls: _instance = None def __new__(cls): # 判斷該類的屬性是否為空;對第一個對象沒有被創建,我們應該調用父類的方法,為第一個對象分配空間 if cls._instance == None: # 把類屬性中保存的對象引用返回給python的解釋器 cls._instance = object.__new__(cls) return cls._instance # 如果cls._instance不為None,直接返回已經實例化了的實例對象 else: return cls._instance def __init__(self): print('init') my1=Mycls() print(my1) my2=Mycls() print(my2)
輸出:
initInit
可以看到雖然叫my1 和my2,但是他們都是對象0x000000406E471148,這就是單例模式的應用。
感謝各位的閱讀,以上就是“Python的__Init__ 和__New__有什么區別”的內容了,經過本文的學習后,相信大家對Python的__Init__ 和__New__有什么區別這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。