單例模式(singleton pattern)是一種常用的軟體設計模式,該模式的主要目的是確保乙個類只有乙個例項物件。
單例模式只生成乙個例項物件,減少了對系統資源的開銷,當乙個物件的產生需要較多的資源,如讀取配置檔案、產生其他依賴時,可以產生乙個「單例物件」然後永久駐留記憶體中,從而極大降低開銷。
在資源共享的情況下,避免由於資源操作時導致的效能或損耗等。例如日誌檔案,應用配置。
在控制資源的情況下,方便資源之間的互相通訊。例如執行緒池等。
基於__new__方法實現
當例項化乙個物件時,是先執行類的__new__方法(如果沒有重寫這個方法,那麼會預設呼叫object.new)來例項化物件;然後再執行類的__init__方法,對這個物件進行初始化,可以基於這個原理實現單例模式。
```python
class
mysingleton
: __obj =
none
# 類屬性
def__new__
(cls,
*args,
**kwargs)
:if cls.__obj ==
none
:print
('new...'
) cls.__obj =
object
.__new__(cls)
return cls.__obj
def__init__
(self,name)
:print
('init...'
) self.name = name
a = mysingleton(
"euansu"
)b = mysingleton(
"nange"
)print
(a)print
(b)print
(a.name)
print
(b.name)
通過如上方法生成的單例物件還存在問題,這裡簡單輸出列印一下結果。
new…不難發現,如上的**在執行的時候進行了一次例項化和兩次初始化,這不是我們所希望的,所以需要進行乙個簡單的判斷,如果物件已經完成了初始化,就不再進行初始化過程。init…
init…
<main.mysingleton object at 0x00000144b0f452b0>
<main.mysingleton object at 0x00000144b0f452b0>
nange
nange
class
mysingleton
: __obj =
none
# 類屬性
__init_flag =
true
# 判斷例項物件是否進行過初始化
def__new__
(cls,
*args,
**kwargs)
:if cls.__obj ==
none
:print
('new...'
) cls.__obj =
object
.__new__(cls)
return cls.__obj
def__init__
(self,name)
:if self.__init_flag==
true
:print
('init...'
) self.name = name
self.__init_flag =
false
a = mysingleton(
"euansu"
)b = mysingleton(
"nange"
)print
(a)print
(b)print
(a.name)
print
(b.name)
再次執行**,得到如下執行結果。
new…進行了一次例項化和一次初始化。init…
<main.mysingleton object at 0x00000275bd1b52b0>
<main.mysingleton object at 0x00000275bd1b52b0>
euansu
euansu
使用模組
編寫乙個模組mysingleton.py檔案,**如下:
class
singleton
:def
__init__
(self,name)
:print
("init..."
) self.name = name
singleton = singleton(
"euansu"
)
如上,生成了乙個類的物件。在其他檔案中匯入此檔案中的物件,這個物件即是單例模式的物件。
from mysingleton import singleton
print
(singleton)
print
(singleton.name)
執行**,得到如下結果:
init…使用裝飾器euansu
def
singleton
(cls)
: instance=
defgetsingleton
(*args,
**kwargs)
:if cls not
in instance:
instance[cls]
=cls(
*args,
**kwargs)
return instance[cls]
return getsingleton
@singleton
classa(
object):
a =1def
__init__
(self,name)
: self.name = name
def__str__
(self)
:return self.name
a = a(
"euansu"
)b = a(
"nange"
)print
(a)print
(b)
執行**,得到如下結果:
euansueuansu
python實現單例模式
最近在寫乙個連線池,而連線池管理類不可避免的需要使用單例來保證所有使用者在取得連線時取到的一定是同乙個管理物件。故將此模式取來研究一番。保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點 設計模式 單例模式是全域性只有乙個訪問點,故對於乙個類來說,任何例項化後訪問到的都應該是同樣的物件。而也有另...
Python 實現單例模式
encoding utf 8 print 方法1 方法1,實現 new 方法 並在將乙個類的例項繫結到類變數 instance上,如果cls.instance為none說明該類還沒有例項化過,例項化該類,並返回 如果cls.instance不為none,直接返回cls.instance class ...
python實現單例模式
單例模式,簡單來說,就是乙個類只能有乙個例項,並且能夠自行例項化向整個系統提供。例如檔案系統和任務管理器等。由此可見,單例模式的要點有三個 1.乙個類只能有乙個例項 2.它必須自行建立這個例項 3.它必須自行向整個系統提供這個例項 在python實現單例模式的方法總結起來有四種及其對應 如下 1.魔...