1. 程式人生 > 其它 >【強基06】__new__和__init__魔法方法的呼叫順序和使用規則

【強基06】__new__和__init__魔法方法的呼叫順序和使用規則

呼叫順序:

類裡面__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

"""