單例模式的一般實現
餓漢式
懶漢式就是通過一個方法才能實現單例,我不是很常用,所以在此就寫個餓漢式。以後再補懶漢式。
單例模式的核心作用是保證一個類只有一個該類型的對象。在一個對象被過多調用時避免過多的消耗內存,即可使用單例模式。
在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)
結果如下是相同的: