1. 程式人生 > 實用技巧 >“Python的單例模式有四種寫法,你知道麼?”——孔乙己

“Python的單例模式有四種寫法,你知道麼?”——孔乙己

什麼是單例模式

單例模式(Singleton Pattern)是最簡單的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。

注意:

1、單例類只能有一個例項。

2、單例類必須自己建立自己的唯一例項。

3、單例類必須給所有其他物件提供這一例項。

使用場景:

1、要求生產唯一序列號。

2、WEB 中的計數器,不用每次重新整理都在資料庫里加一次,用單例先快取起來。

3、建立的一個物件需要消耗的資源過多,比如 I/O 與資料庫的連線等。

程式碼實現

1 使用__new__方法

__new__()__init__()之前被呼叫,用於生成例項物件。利用這個方法和類的屬性的特點可以實現設計模式的單例模式。

對這塊不瞭解的,可以檢視我以前發的文章:

Python類中的__new__和__init__的區別

class Singleton(object):
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kw)
return cls._instance class MyClass(Singleton):
a = 1

2 共享屬性

建立例項時把所有例項的__dict__指向同一個字典,這樣它們具有相同的屬性和方法.

class Borg(object):
_state = {}
def __new__(cls, *args, **kw):
ob = super(Borg, cls).__new__(cls, *args, **kw)
ob.__dict__ = cls._state
return ob class MyClass2(Borg):
a = 1

3 裝飾器版本

def singleton(cls):
instances = {}
def getinstance(*args, **kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return getinstance @singleton
class MyClass:
...

4 import方法

作為python的模組是天然的單例模式

mysingleton.py

class My_Singleton(object):
def foo(self):
pass my_singleton = My_Singleton() # to use
from mysingleton import my_singleton my_singleton.foo()

驗證一下

我們可以看到類物件和記憶體id()是一樣的。

參考檔案

  1. https://www.runoob.com/design-pattern/singleton-pattern.html

本文首發於BigYoung小站