實現Python單例模式時發現的乙個小問題

2021-08-19 15:37:36 字數 1325 閱讀 1969

今天覆習單例模式時,當用基於__new__方法實現時,遇到過小問題。

**如下:

from threading import lock

class

signleton

(object):

_signleton_lock = lock()

def__init__

(self, a, curr='a'):

self.a = a

self.curr = curr

def__new__

(cls, *args, **kwargs):

ifnot hasattr(cls, '_instance'):

with signleton._signleton_lock:

ifnot hasattr(cls, '_instance'):

cls._instance = object.__new__(cls)

return cls._instance

defprove

(self):

print('id = %d, a = %d, curr = %s' % (id(self), self.a, self.curr))

if __name__ == '__main__':

t1 = signleton(2, 'b')

t2 = signleton(7, 'c')

print(t1.prove() == t2.prove())

執行結果:

id = 140094976669456, a = 7, curr = c

id = 140094976669456, a = 7, curr = c

true

可以看到這個方法確實實現了單例模式。

但有個問題,例項的屬性被修改為最後一次例項化時傳入的引數了。

一開始有點不理解。直接上手除錯了一下,才曉得問題出在哪。

python中例項化物件時,需要兩步走。

呼叫__new__方法,返回乙個物件

呼叫__init__方法, 對上一步返回的物件進行初始化

而我剛剛實現單例模式的方法只是修改了__new__方法,使其每次都返回同乙個物件。

但是沒有處理__init__方法,這就使得每次例項化物件時,都要執行一次__init__方法。

這可不就會每次都把物件的屬性修改為最後一次例項化的引數了嘛。

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.魔...