python使用__new__創建一個單例模式(單例對象)


#單例模式:使一個類只產生一個對象。他們的id地址都指向同一個內存地址

第一步:理解誰創建了對象

# 單例模式
# 首先明白,我們在創建一個類的對象的時候,其實是調用的這個類的父類,即繼承object
# 然后調用這個objectnew方法來創建一個對象。
# 創建對象后,才會執行__init__方法,進行初始化


# 第一步:
class Person:
    __instance = None

    def __new__(cls, *args, **kwargs):
        print("1111")

    def __init__(self):
        print("創建對象后,進行初始化")

p = Person()  #結果 1111
#從結果分析:我自己創建的這個new方法,會先執行我自己的new方法,但是並沒有產生對象(因為沒有執行__init__方法)
# 我們創建對象的時候,是object這個原類幫助我們產生了對象。所以我們要調用父類(object)的new方法來產生一個對象。

第二步理解對象的執行順序:

# 因此:下面的這個方法才能幫助我們產生一個對象

class Person:
    __instance = None

    def __new__(cls, *args, **kwargs):
        print(111)
        obj=object.__new__(cls)  # 傳入我們要產生對象的這個類
        return obj

    def __init__(self):
        print("創建對象后,進行初始化")


p1=Person()
# 111
# 創建對象后,進行初始化

'''
結果分析:
我調用了objcet的__new__方法,幫助我產生了一個對象,並且這個對象也執行了__init__方法。

'''

第三步:理解怎么才能只創建一個對象,通過什么條件來只創建一個對象

# 通過上面兩個的案例理解。我知道了我應該調用父類的new方法來創建一個對象,
並且我希望這個,再次創建對象的時候,創建的對象還是剛開始創建的那個對象。
所以我希望用定義的私有變量來做個判斷,如果私有變量__instance有值 我則直接
返回剛開始創建的那個對象。如果沒有創建,則調用父類new方法創建一個對象。
class Person:
    __instance = None

    def __new__(cls, *args, **kwargs):
        print("1111")
        if Person.__instance is None:  # 只有第一次的時候,條件是None,所以第一次的時候才創建一個對象,后面的條件都不是false,所以直接返回第一次創建的對象
            obj = object.__new__(cls)  # 繼承調用object的new方法產生一個對象
            Person.__instance = obj     # 將這個對象賦值給這個類的私有變量__instance

        return Person.__instance

    def __init__(self):
        print("創建對象后,進行初始化")


p1 = Person()
p2 = Person()
p3 = Person()
p4 = Person()
print(id(p1),id(p2),id(p3),id(p4))

輸出結果:顯示4個對象的內存地址都一樣
416664513336 416664513336 416664513336 416664513336
 
        

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM