【強基06】__new__和__init__魔法方法的呼叫順序和使用規則
阿新 • • 發佈:2021-12-17
呼叫順序:
類裡面__new__ 方法的執行優先順序高於__init__方法,在類體程式碼執行的過程中,遇到兩者,會先執行__new__方法的函式體程式碼,之後,再執行__init__ 方法的函式體程式碼。
使用規則:
__init__方法,主要用來給類做初始化引數設定
__new__方法,主要用來類例項化產生物件的這個過程進行干預,進而達到一定的目的;
舉例: 單例模式
通俗理解單例,就是:一個類不管呼叫多少次,只能建立一個例項物件。
(類在每次例項化的時候都會建立一個新的物件,如果要求類只能被例項化一次,也就是即使多次呼叫,但還是用的是同一個物件,這就需要通過單例模式進行設定)
下面寫一個單例模式,控制物件的建立,不管呼叫類多少次,都是使用的同一個物件
# 單例模式 class Myclass: __instance = None def __new__(cls, *args, **kwargs): # 判斷類是否已建立過物件 if cls.__instance: print('條件成立,之前建立過物件,直接返回前面建立的物件') return cls.__instance else: print('類之前沒有建立過物件') # 開始建立物件 obj = super().__new__(cls) # 修改__instance的值為建立的物件 cls.__instance = obj # 返回物件 return obj m1 = Myclass() m2 = Myclass() m3 = Myclass() print(m1, m2, m3) print(id(m1), id(m2), id(m3)) """列印結果如下: 類之前沒有建立過物件 條件成立,之前建立過物件,直接返回前面建立的物件 條件成立,之前建立過物件,直接返回前面建立的物件 <__main__.Myclass object at B240> <__main__.Myclass object at B240> <__main__.Myclass object at B240> 43168320 43168320 43168320 """ # 單例模式簡化版程式碼 # 思路整理: # 如果變數__instance沒有值,就建立一個物件,並賦值儲存起來; # 如果變數__instance 有值,就直接將之前儲存的物件返回出去; class Myclass1: __instance = None def __new__(cls, *args, **kwargs): if not cls.__instance: obj = super().__new__(cls) cls.__instance = obj return cls.__instance m1 = Myclass1() m2 = Myclass1() m3 = Myclass1() print(m1, m2, m3) print(id(m1), id(m2), id(m3)) """列印結果如下: <__main__.Myclass1 object at B128> <__main__.Myclass1 object at B128> <__main__.Myclass1 object at B128> 43168040 43168040 43168040 """