Python3 實現單例設計模式

單例模式的一般實現

餓漢式

懶漢式就是通過一個方法才能實現單例,我不是很常用,所以在此就寫個餓漢式。以後再補懶漢式。
單例模式的核心作用是保證一個類只有一個該類型的對象。在一個對象被過多調用時避免過多的消耗內存,即可使用單例模式。

在python中新建一個對象會調用 __new__ 方法爲創建的對象分配其內存空間,並且返回該對象的引用,隨後將會傳給 __init__ 函數進行實例化。

一般情況下並不需要調用 new 方法,當使用單例時這一步是必要的。在重寫 new 方法時需要返回當前實例的類 cls :return super().__new__(cls)。得到了分配的內存空間引用後,開始爲對象進行實例化,代碼可以簡單的寫爲如下:

class ClassObj(object):
    def __new__(cls):
        print("進行分配內存")
        return super().__new__(cls)

    def __init__(self):
        print("開始初始化")
cobj = ClassObj()

運行結果如下:
在這裏插入圖片描述
但是以上的代碼並沒有實現單例模式,這個時候,我們需要對以上代碼進行更改。
在使用 new 方法時判斷是否已經被實例化:

class ClassObj(object):
    instance=None
    def __new__(cls):
        if cls.instance is None:
            cls.instance=super().__new__(cls)
            print("進行分配內存")
        else:
            print("已經分配了")
        return cls.instance

    def __init__(self):
        print("已經分配了")
cobj = ClassObj()
cobj1 = ClassObj()

以上代碼在ClassObj中,定義了一個成員變量 instance,用來存儲分配的空間引用,並且在__new__方法中最後return instance;假設第一次新建該類對象,instance爲None則會進行實例化,假設不爲None,則會提示已經分配了,不會再次分配空間,進行創建。運行結果如下:
在這裏插入圖片描述
以上結果只在第一次新建對象時分配了空間,之後創建對象並沒有新建空間。
這時也可以直接輸出類對象查看空間:

cobj = ClassObj()
cobj1 = ClassObj()
print(cobj)
print(cobj1)

結果如下是相同的:
在這裏插入圖片描述

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