1. 程式人生 > >Python-單例模式-只初始化一次

Python-單例模式-只初始化一次

單例模式 只初始化一次

單例模式建立的原理就是借用了私有類屬性的性質,我們知道私有類屬性不能直接在類外被修改,所以用私有類屬性的狀態當做條件來控制類內方法的呼叫

下面程式碼中的__species負責控制__new__方法,保證例項物件只能被建立一次,建立多個物件,均指向同一個資料記憶體位置

__first_init負責控制__init__方法,保證再次建立的物件不能更改初始化的內容

class Animal(object):

    __species = None
    __first_init = True

    def __new__(cls, *args, **kwargs):
        if cls.__species == None:
            cls.__species = object.__new__(cls)
        return cls.__species

    def __init__(self,name):
        print("-----init----")
        if self.__first_init:
            self.name = name
            self.__class__.__first_init = False
            # 相當於Animal.__first_init = False

    def __str__(self):
        return "-------str---%s" %self.name


if __name__ == '__main__':
    dog = Animal('二哈')
    print(dog)
    print(id(dog))  
    dog2 = Animal('金毛')
    print(dog)
    print(id(dog2))

執行結果:
-----init----
-------str---二哈
139764904013104
-----init----
-------str---二哈
139764904013104


呼叫new方法必須要有return, 返回建立的例項物件或者是父類的__new__方法建立例項物件

由執行結果可知,兩次建立的例項物件指向了同一個id,即 建立單例模式
第二次建立的例項物件dog2“金毛”,並未建立成功,仍然是第一次創建出來的例項物件dog”二哈”,即 初始化一次