Python單例模式的採坑

2021-10-07 05:23:41 字數 1789 閱讀 8345

classa(

):_instance =

none

def__new__

(cls,

*args,

**kwargs)

:if cls._instance is

none

: cls._instance =

super()

.__new__(cls)

print

(cls._instance)

return cls._instance

def__init__

(self)

:print

("heheh"

) self.url =

dict()

a = a(

) a.url[

"fd"]=

"cd"

print

(a.url)

b = a(

)# 雖然建立的為同一例項,但是__init__方法在此處仍會執行,因為__new__執行之後,會執行__init__方法

print

(b.url)

# 此處為空{},因為再次建立了乙個字典,覆蓋了原來的屬性

b.url[

"fdsfsdf"]=

"dfsfksd"

print

(a.url)

print

(b.url)

列印結果:

<__main__.a object at 0x00000213100c6a00

>

heheh

<__main__.a object at 0x00000213100c6a00

>

heheh

解決辦法:

classa(

object):

_instance =

none

_first_create =

true

# 只有第一次例項化的時候才會初始化

def__new__

(cls,

*args,

**kwargs)

:if cls._instance is

none

: cls._instance =

super()

.__new__(cls)

return cls._instance

def__init__

(self)

:if self._first_create:

self.url =

dict()

self._first_create =

false

a = a(

)a.url[

"fd"]=

"cd"

print

(a.url)

print

(a.__dict__)

b = a(

)# 雖然建立的為同一例項,但是__init__方法在此處仍會執行,因為__new__執行之後,會執行__init__方法

print

(b.url)

# 此處為空{},因為再次建立了乙個字典,覆蓋了原來的屬性

b.url[

"fdsfsdf"]=

"dfsfksd"

print

(a.url)

print

(b.url)

python單例模式繼承 python單例模式

我們可以使用 new 這個特殊方法。該方法可以建立乙個其所在類的子類的物件。更可喜的是,我們的內建 object 基類實現了 new 方法,所以我們只需讓 sing 類繼承 object 類,就可以利用 object 的 new 方法來建立 sing 物件了。classsing object def...

單例模式中的那些坑

單例模式相信大家都有遇到,面試中出現概率還是比較高的,從最基礎的加synchronized鎖到雙重檢查鎖,再到加上volatile關鍵字,小小的乙個單例模式裡還是存在不少問題的,下面先看 基礎的 雙重檢查的 這一步的改善比較好理解,在多執行緒的情況下第乙個方法的效率會低於第二個方法的,第乙個方法會導...

Java單例模式的幾種坑

在乙個jvm程序中,乙個類對應的例項物件有且只有乙個。因為在乙個程式中,有些業務邏輯和流程是重複的 通用的,沒有必要在每次執行時再進行new相同物件的操作。只進行一次new操作,沒有物件的頻繁建立和 提高了jvm的執行響應速度。尤其是在高併發的情況下,對程式的執行有很大的提公升。1 在多執行緒的場景...