python之單例模式


#單例模式:有時須要寫出高性能的類,那麼會採用單例模式。通俗的解釋就是類只建立一次實例,貫穿整個生命週期,實現了高性能。

#1.模塊化單例
#所謂的模塊化就是一個單獨的.py文件來存儲類,這樣就是單例模式。
#其原理就是模塊被導入時會產生一個.pyc文件,其它文件在導入的時候不會在去調用。直接讀取pyc

#2.裝飾器單例模式
#原理也很簡單,用裝飾器裝飾類。
#裝飾器自己實現,傳入類對象,進行判讀是否是一個實例,若是是直接返回該實例(須要注意是直接返回,再也不建立)。
#若是不是一個實例,那麼建立該實例,並把該實例保存在一個變量中,用來標記實例已被建立。

#實現單例模式裝飾器
def sing(cls): save_instance = {} def _wrap(*args, **kwargs): #若是cls沒在save_instance中說明,cls是第一次建立實例
        if not 'cls' in save_instance: save_instance['cls'] = cls(*args, **kwargs) #注意這裏的括號,實例化一個類要帶括號不然就是類對象
        return save_instance['cls'] #把實例返回。
    return _wrap

示例1:
class Sing_Cls_Demo(): def __init__(self, x, y): self.x = x self.y = y a1 = Sing_Cls_Demo(1, 2) a2 = Sing_Cls_Demo(3, 4) print(a1) print(a2)

#示例1結果:從如下結果能夠看出,不是同一個實例對象
# <__main__.Sing_Cls_Demo object at 0x036692B0> # <__main__.Sing_Cls_Demo object at 0x03669730>

示例2:
@sing class Sing_Cls_Demo(): def __init__(self, x, y): self.x = x self.y = y a1 = Sing_Cls_Demo(1, 2) a2 = Sing_Cls_Demo(3, 4) print(a1) print(a2)
#示例2結果:給類帶上裝飾器,從結果看出,兩個類初始化,只建立了一個實例。
# <__main__.Sing_Cls_Demo object at 0x034D9050> # <__main__.Sing_Cls_Demo object at 0x034D9050>
 

 

 

#3類模式的單例
#原理其實同樣,咱們先在類中埋一個屬性,或者一個變量也能夠。以後判斷這個是否存在預設標記,存在原樣返回。不存在建立返回。
#如下代碼只是類實現的一種方例。
class Sing():
    def __init__(self, x, y):
        self.x = x
        self.y = y

    #這裏咱們經過方法來給類作標記。  實例化時也調用該方法。
    @classmethod
    def instance(cls, *args, **kwargs):
        if not hasattr(Sing,'instance_flag'): #判斷若是沒有這個屬性,說明類沒被實例化過。
            Sing.instance_flag = Sing(*args, **kwargs)
        return Sing.instance_flag


a1 = Sing.instance(1, 2)
a2 = Sing.instance(3, 4)

print(a1)
print(a2)

#輸出結果,能夠看出是同一實例對象。
# <__main__.Sing object at 0x03479730>
# <__main__.Sing object at 0x03479730>
#以上存在的問題。若是是多線程下有機率的會出現問題。能夠加上線程鎖來解決這問題。
#4__new__模式原理是同樣的,不在重複。  在python中類被實例化的時候最早執行的是__new__文章就是從__new__開始。在這裏作判斷,第一次實例一下返回,不是第一次原樣返回。
相關文章
相關標籤/搜索