學習python: 單例設計模式

簡介:

本文主要講兩個問題:

  1. pyhton創建一個對象的過程。

  2. 單例設計模式的一種實現方式。

python 創建一個對象的過程

當我們實例化一個對象的時候,基本上可以分爲如下步驟:

  1. 調用__new__(cls)方法來創建一個對象,然後找了一個變量來接受__new__的返回值,這個返回值表示創建出來的對象的引用

  2. 調用__init__(剛創建出來的對象的引用)方法,初始化成員變量。

  3. 返回對象的引用

注意,這裏__new__方法裏面需要傳遞的參數是cls,指的是

我們可以拿python創建一個對象的過程和c++的構造函數做個對比。顯然c++的構造函數即負責創建對象,又負責初始化成員變量; 而python是通過兩個步驟來完成的:__new__(cls)方法只負責創建對象,__init__方法只負責初始化成員變量。

從上面的總結來看,一個常見的誤區就是錯誤的把__init__方法等價於構造函數,嚴格來說他們是不等價的。

單例模式的一種實現方式

有了上述__new__方法的機制,我們可以設計一個單例模式如下:

這裏增加了一個附加的東西,即設計一個單例的同時只初始化一次成員變量

class Singleton(object):
    __instance = None
    __init_flag = False 

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

    def __init__(self, num): # 這裏通過設置一個類屬性的方式實現了只初始化一次成員變量的目的
        if not Singleton.__init_flag:
            self.num = num
            Singleton.__init_flag = True

s = Singleton(100)
print(s.num)

s1 = Singleton(200) # 第二次初始化參數時不會打印200
print(s1.num)

# Output
100
100
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章