單例模式,簡單來說,就是乙個類只能有乙個例項,並且能夠自行例項化向整個系統提供。例如檔案系統和任務管理器等。
由此可見,單例模式的要點有三個:
1. 乙個類只能有乙個例項;
2. 它必須自行建立這個例項;
3. 它必須自行向整個系統提供這個例項
在python實現單例模式的方法總結起來有四種及其對應**如下:
1. 魔術方法
class
singleton
(object):
""" 使用__new__實現單例模式
"""def__new__
(self, *args, **kwargs):
ifnot hasattr(self, '_instance'):
# 如果未例項化, 呼叫父類的__new__方法來例項化
self._instance = super(singleton, self).__new__(self, *args, **kwargs)
return self._instance
a1 = singleton()
a2 = singleton()
print(a1 is a2) #true
2. 裝飾器或者類裝飾器
def
singletonbydecorator
(cls):
""" 使用裝飾器實現單例模式
"""instance = {}
defwrap
(*args, **kwargs):
if cls not
in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return wrap
@singletonbydecorator
class
bar():
def__init__
(self):
# 只會執行一次
print("init in class bar")
a3 = bar()
a4 = bar()
print(a3 is a4)
# 執行結果
# init in class bar
# true
class
singletonbyclassdecorator
(object):
""" 使用類裝飾器實現單例模式
"""def__init__
(self, cls):
self.cls = cls
self._instance = none
def__call__
(self, *args, **kwargs):
ifnone == self._instance:
self._instance = self.cls(*args, **kwargs)
return self._instance
@singletonbyclassdecorator
class
anotherbar
(object):
def__init__
(self):
print("init in class anotherbar")
# 只會執行一次
a5 = anotherbar()
a6 = anotherbar()
print(a5 is a6)
# 執行結果
# init in class anotherbar
# true
3. 元類
class
singletonbymetaclass
(type):
""" 使用元類實現單例模式
"""def__init__
(self, *args, **kwargs):
self._instance = none
super(singletonbymetaclass, self).__init__(*args, **kwargs)
def__call__
(self, *args, **kwargs):
if self._instance is
none:
self._instance = super(singletonbymetaclass, self).__call__(*args, **kwargs)
return self._instance
class
foo(metaclass = singletonbymetaclass):
#單例類
# foo(object) py2中要注意,寫法稍有不同
__metaclass__ = singletonbymetaclass
# **執行到這裡,元類中的__new__和__init__方法其實都已經被執行了,切只會執行一次
a7 = foo()
a8 = foo()
print(a7 is a8) # true
4. import:作為python模組是天然的單例模式
以上為單例模式的個人理解以及python實現的幾種方法
如有錯誤,歡迎指正和交流!
python實現單例模式
最近在寫乙個連線池,而連線池管理類不可避免的需要使用單例來保證所有使用者在取得連線時取到的一定是同乙個管理物件。故將此模式取來研究一番。保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點 設計模式 單例模式是全域性只有乙個訪問點,故對於乙個類來說,任何例項化後訪問到的都應該是同樣的物件。而也有另...
Python 實現單例模式
encoding utf 8 print 方法1 方法1,實現 new 方法 並在將乙個類的例項繫結到類變數 instance上,如果cls.instance為none說明該類還沒有例項化過,例項化該類,並返回 如果cls.instance不為none,直接返回cls.instance class ...
Python實現單例模式
語言是共通的,想要用不同語言實現單例模式,首先要清楚什麼是單例模式,單例模式即乙個類有且僅有乙個例項,那麼通過python怎麼實現乙個類只能有乙個例項呢。首先先建立乙個類,比如宇宙只有乙個地球 class earth pass a earth print id a b earth print id ...