“Python的單例模式有四種寫法,你知道麼?”——孔乙己
阿新 • • 發佈:2020-07-21
什麼是單例模式
單例模式(Singleton Pattern)是最簡單的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。
注意:
1、單例類只能有一個例項。
2、單例類必須自己建立自己的唯一例項。
3、單例類必須給所有其他物件提供這一例項。
使用場景:
1、要求生產唯一序列號。
2、WEB 中的計數器,不用每次重新整理都在資料庫里加一次,用單例先快取起來。
3、建立的一個物件需要消耗的資源過多,比如 I/O 與資料庫的連線等。
程式碼實現
1 使用__new__方法
__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()是一樣的。
參考檔案
本文首發於BigYoung小站