單例模式(Singleton Pattern)是一種經常使用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你但願在整個系統中,某個類只能出現一個實例時,單例對象就能派上用場。在它的核心結構中只包含一個被稱爲單例的特殊類。經過單例模式能夠保證系統中,應用該模式的類一個類只有一個實例。即一個類只有一個對象實例。python
其實,Python 的模塊就是自然的單例模式,由於模塊在第一次導入時,會生成 .pyc
文件,當第二次導入時,就會直接加載 .pyc
文件,而不會再次執行模塊代碼。所以,咱們只需把相關的函數和數據定義在一個模塊中,就能夠得到一個單例對象了。設計模式
class Person(): def foo(self): pass p1 = Person()
在另外一個文件中導入使用就能夠了。ide
from a.b import p1 print(id(p1.foo()))
你會發現,無論使用多少次,或者在幾個文件中引用,每次打印的id都是相同的。函數
def outer(cls): instance = None def inner(*args,**kwargs): nonlocal instance if instance == None: instance = cls(*args,**kwargs) return instance return inner @outer class Person(): def __init__(self): pass p1 = Person() p2 = Person() print(id(p1)) print(id(p2))
id打印結果spa
咱們知道,當咱們實例化一個對象時,是先執行了類的__new__方法(咱們沒寫時,默認調用object.__new__),實例化對象;而後再執行類的__init__方法,對這個對象進行初始化,全部咱們能夠基於這個,實現單例模式。設計
class Person(object): __instance = None def __new__(cls, *args, **kwargs): if cls.__instance == None: cls.__instance = object.__new__(cls) return cls.__instance def __init__(self): pass p1 = Person() p2 = Person() print(id(p1)) print(id(p2))
id打印結果3d
好了,先介紹這三種吧,python實現單例模式方式有不少,可是另外幾種我本身都尚未弄清楚。。。之後慢慢補。code