python:單例模式--使用__new__(cls)實現


單例模式:即一個類有且僅有一個實例。

那么通過python怎么實現一個類只能有一個實例呢。

class Earth:
    """
    假如你是神,你可以創造地球
    """
    print '歡迎來到地球'

# 生成一個地球
a = Earth()
print id(a)

# 再生成一個地球
b = Earth()
print id(b)

輸出:

歡迎來到地球
53356616
59869960

從上面例子可以看到,地球被創建了兩次,因為地球只能有一個,所以Earth類只能有一個實例,所以需要單例模式實現。

 

python中,一個類創建對象實例是通過調用父類object的 __new__(cls)方法來創建對象的

我們可以通過重寫 __new__(cls)方法去實現類只創建一個實例,再創建的實例返回上一次的對象的引用。

class Earth(object):
    """
    假如你是神,你可以創造地球
    """
    # 定義一個類屬性做判斷
    instance = None

    def __new__(cls, *args, **kwargs):
        # 如果instance為空則說明是第一次創建實例
        # 通過父類的__new__(cls)創建實例
        if cls.instance == None:
            # 調用父類的__new__(cls)方法創建實例,並將該實例賦值給類變量instance,此時該變量的值從None變為該實例
            cls.instance = object.__new__(cls)
            # print cls.instance
            # 返回實例化對象
            return cls.instance
        else:
            # 返回上一個對象的引用
            return cls.instance

    # print '歡迎來到地球'


print '原始的instance值為:%s' % Earth.instance

# 生成一個地球
a = Earth()
# 創建實例后的instance值
print '創建實例后的instance值為:%s' % Earth.instance
print id(a)

# 再生成一個地球
b = Earth()
print id(b)

 

輸出:

原始的instance值為:None
創建實例后的instance值為:<__main__.Earth object at 0x0000000003090E10>
50925072
50925072

 

可以看到兩次的id相同,為同一個對象

 

參考:https://blog.csdn.net/CtyCt_/article/details/79677125

多種實現單例模式:https://www.cnblogs.com/huchong/p/8244279.html


免責聲明!

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



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