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 在多執行緒的場景...