這是本人的一篇學習筆記。
本文用 python 實現單體模式,參考了這裡
class
borg:
_shared_state = {}
def__init__
(self
):self.__dict__ =
self._shared_state
class
singleton
(borg):
def__init__
(self
, name):
super().__init__()
self.name = name
def__str__
(self
):return
self.name
x = singleton('sausage'
)print(x)
y = singleton('eggs'
)print(y)
z = singleton('spam'
)print(z)
print(x)
print(y)
注意,這種方法實現的並非真正的單體模式!!
下面幾種方法實現的才是真正的單體模式
先看看這裡關於元類的描述:
元類一般用於建立類。
在執行類定義時,直譯器必須要知道這個類的正確的元類。直譯器會先尋找類屬性注意__metaclass__
,如果此屬性存在,就將這個屬性賦值給此類作為它的元類。如果此屬性沒有定義,它會向上查詢父類中的__metaclass__
。如果還沒有發現__metaclass__
屬性,直譯器會檢查名字為__metaclass__
的全域性變數,如果它存在,就使用它作為元類。否則, 使用內建的type
作為此類的元類。
__call__
的引數
class
singleton
(type
): _instance =
none
def__call__
(self, *
args,
**kw):
if self._instance is
none
: self._instance =
super().__call__(*args, **kw)
return
self._instance
class
myclass
(object
): __metaclass__ = singleton
print(myclass())
print(myclass())
注意__new__
的引數
class
singleton
(type
): _instance =
none
def__new__
(cls, name, bases, dct):
if cls._instance is
none
: cls._instance =
super().__new__(cls, name, bases, dct)
return
cls._instance
class
myclass
(object
): __metaclass__ = singleton
print(myclass())
print(myclass())
注意__new__
的引數
class
singleton
(object
): _instance =
none
def__new__
(cls):
if cls._instance is
none
: cls._instance =
super().__new__(cls)
return
cls._instance
class
myclass
(object
): __metaclass__ = singleton
print(myclass())
print(myclass())
下面還有乙個很巧妙的方法實現單體模式
class
singleton:
_instance =
none
@classmethod
defcreate
(cls):
if cls._instance is
none
: cls._instance = cls()
return
cls._instance
def__init__
(self
):self.x =
5# or whatever you want to do
sing = singleton.create()
print(sing.x) # 5
sec = singleton.create()
print(sec.x) # 5
單體模式的簡單實現
單體模式的思路 單體模式在多執行緒中容易出現被例項化多次的問題,因此要進行雙重為空判斷來緩解次問題 1.把建構函式的作用域改為私有的,那樣外面就不能new 2.通過乙個類的靜態方法得到乙個靜態例項 例如 public class a static a a null static a console....
python單例模式的幾種實現方式
單例模式 singleton pattern 是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。實現單例模式的幾種方法 1.使用模組 其實,python的模組就是天然的單例模式,因為模組在第一次匯入的時候,...
物件的單體模式和物件導向
class animal 一定不要加逗號,加了會報錯 showname var a2 new animal 小胡 12 a.showname1 列印出來 12 上面 定義了乙個 類 可以看到裡面有乙個constructor方法,這就是構造方法,而this關鍵字則代表例項物件。也就是說,es5 的建構...