參考:黑馬程序員教程 - Python基礎(chǔ) 面向?qū)ο?/a>
單例指一個(gè)對象只生成一個(gè)實(shí)例,也就是說對象只會在內(nèi)存中分配一塊區(qū)域。比如Music player,一次只能播放一個(gè)歌曲,只分配一塊內(nèi)存給它,不能同時(shí)播放兩首歌。只有當(dāng)它銷毀了,才會生成一個(gè)空間給另一首歌。

image
要想達(dá)到單例這種效果、這種設(shè)計(jì)模式,就需要涉及內(nèi)存分配問題。既然涉及到內(nèi)存分配問題,就需要用到對象的內(nèi)置函數(shù)中涉及內(nèi)存分配的__new__函數(shù)來完成。
__new__方法有兩個(gè)作用:
- 在內(nèi)存中為
對象分配空間 - 返回
對象的引用
而實(shí)現(xiàn)單例設(shè)計(jì)模式,就是對__new__方法的重寫!
重寫new方法時(shí)需要注意:

image
如果沒有在重寫new時(shí)候返回對象引用,那么在生成實(shí)例時(shí),就只能得到一個(gè)None。
重寫單例對象的new方法的固定格式(必須要遵守):
def __new__(cls, *args, **kwargs):
# Your code
# ........
# ........
# Return the generated instance of the object
return super().__new__(cls)
如果在new中實(shí)現(xiàn)單例的設(shè)計(jì)模式呢?
主要思路如下:
- 添加一個(gè)
類屬性 - 將這個(gè)類屬性的初始值為None
- 如果有實(shí)例被創(chuàng)建,這個(gè)類屬性就為
- 再有實(shí)例被創(chuàng)建時(shí),如果發(fā)現(xiàn)類屬性為None,則不創(chuàng)建,且返回之前已創(chuàng)建的實(shí)例

image
代碼如下(非常固定,沒什么需要改的):
class MyClass(object):
instance = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance