單例是最常使用的模式,通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於被外界訪問,從而方便對例項個數的控制並節約系統資源。
python實現單例模式一般可以對建立例項的方法 __new__進行改造
class
singleton
(object):
_instance =
none
def__new__
(cls,
*args,
**kwargs):if
not cls._instance:
cls._instance =
super
(singleton, cls)
.__new__(cls,
*args,
**kwargs)
return cls._instance
if __name__ =
'__main__'
: s1 = singleton(
) s2 = singleton(
)assert
id(s1)
==id
(s2)
上面這種這個方法基本上可以保證「只能有乙個例項」的要求了,但是在併發情況下可能會發生意外,解決辦法是引入鎖:
class
singleton
(object):
objs =
objs_locker = threading.lock(
)def
__new__
(cls,
*args,
**kwargs)
:if cls in cls.objs:
return cls.objs[cls]
with objs_locker:
if cls in cls.objs:
## double check locking
return cls.objs[cls]
cls.objs[cls]
=object
.__new__(cls)
利用經典的雙檢查鎖機制,確保了在併發環境下 singleton 的正確實現。但這個方案並不完美,比如以下兩個問題:
其實,python 的模組就是天然的單例模式,因為模組在第一次匯入時,會生成 .pyc 檔案,當第二次匯入時,就會直接載入 .pyc 檔案,而不會再次執行模組**。因此,我們只需把相關的函式和資料定義在乙個模組中,就可以獲得乙個單例物件了。如果我們真的想要乙個單例類,可以考慮這樣做:
新建乙個mysingleton.py:
class
singleton
(object):
deffoo
(self)
:pass
singleton = singleton(
)
將上面的**儲存在檔案 mysingleton.py 中,要使用時,直接在其他檔案中匯入此檔案中的物件,這個物件即是單例模式的物件:
from a import singleton
其它實現單例模式的方法
#通過裝飾器實現
defsingleton
(cls)
: _instance =
def_singleton
(*args,
**kargs)
:if cls not
in _instance:
_instance[cls]
= cls(
*args,
**kargs)
return _instance[cls]
return _singleton
@singleton
classa(
object):
a =1def
__init__
(self, x=0)
: self.x = x
a1 = a(2)
a2 = a(
3)
python手寫單例 Python實現單例模式
語言是共通的,想要用不同語言實現單例模式,首先要清楚什麼是單例模式,單例模式即乙個類有且僅有乙個例項,那麼通過python怎麼實現乙個類只能有乙個例項呢。首先先建立乙個類,比如宇宙只有乙個地球 class earth pass a earth print id a b earth print id ...
利用Qt實現單例 C
第一種是模板單例,可以通用 template typename t class singleobj private static qmutex mutex static qscopedpointer instance template typename t qmutex singleobj mute...
python 實現單例
單例即單個例項,就是乙個類建立例項物件時無論他建立了多少個例項這些例項同樣的 正常情況先乙個類建立n個例項物件就有n個不同的例項 單例的作用 節省記憶體空間,若每次都用類建立不同的例項就會造成空間的極大浪費 這裡介紹最簡單的實現單例的方法 使用 new 方法 new 方法的作用在於建立乙個例項,發生...