Python中的單例模式

  介紹

  單例模式(Singleton Pattern)是一種經常使用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你但願在整個系統中,某個類只能出現一個實例時,單例對象就能派上用場。在它的核心結構中只包含一個被稱爲單例的特殊類。經過單例模式能夠保證系統中,應用該模式的類一個類只有一個實例。即一個類只有一個對象實例。python

  單例模式的實現

方式一:python就是自然的單例模式

  其實,Python 的模塊就是自然的單例模式,由於模塊在第一次導入時,會生成 .pyc 文件,當第二次導入時,就會直接加載 .pyc 文件,而不會再次執行模塊代碼。所以,咱們只需把相關的函數和數據定義在一個模塊中,就能夠得到一個單例對象了。設計模式

class Person():
    def foo(self):
        pass

p1 = Person()
a/b.py

  在另外一個文件中導入使用就能夠了。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__方式實現單例模式

  咱們知道,當咱們實例化一個對象時,是先執行了類的__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

未完待續。。。

相關文章
相關標籤/搜索