此裝飾器可以將任意的類裝飾為單例class
singleclass
(object):
__instance =
0def
__new__
(cls,
*args,
**kwargs):if
not cls.__instance:
cls.__instance =
object
.__new__(cls,
*args,
**kwargs)
return cls.__instance
return cls.__instance
a = singleclass(
)b = singleclass(
)print(id
(a))
# 38638368
print(id
(b))
# 38638368
print(id
(a)==
id(b)
)# true
def
sing_fun
(fun)
: instance =
0def
inner_fun
(*args,
**kwargs)
:nonlocal instance
ifnot instance:
instance = fun(
*args,
**kwargs)
return instance
return instance
return inner_fun
@sing_fun
class
singleclass2()
:pass
a = singleclass2(
)b = singleclass2(
)print(id
(a))
# 35492696
print(id
(b))
# 35492696
print(id
(a)==
id(b)
)# true
執行過程:在直接執行python模組時,類首先被載入並執行(類中的類變數等會被載入執行),然後執行裝飾器函式,也就是執行singleclass2 =sing_fun(singleclass2)這句**,此時會將sing_fun()函式中的**執行,然後將返回值賦給singleclass2,此後若是初始化物件,則直接呼叫的是inner_fun()方法,這就是裝飾器的原理。梳理一下裝飾器的原理:
1.被裝飾的函式會把函式名傳給裝飾器函式
2.裝飾器函式會把返回值賦給被裝飾的函式名
class
classdec()
: __instance =
0def
__init__
(self,cls)
: self.cls = cls
def__call__
(self,
*args,
**kwargs):if
not self.__instance:
classdec.__instance = self.cls(
*args,
**kwargs)
return classdec.__instance
return classdec.__instance
@classdec
class
singleclass2()
:pass
a = singleclass2(
)b = singleclass2(
)print(id
(a))
# 35492696
print(id
(b))
# 35492696
print(id
(a)==
id(b)
)# true
python3單例模式
單例模式是某個類在整個系統中只存在乙個例項的一種設計模式。使用單例模式的好處 單例模式不僅可以減少記憶體資源占用,而且因為只初始化一次,還可以加快執行效能。例如當程式通過乙個類來讀取配置資訊,而程式多個地方需要使用配置資訊,這時整個程式執行過程中只需乙個例項物件即可,可減少占用記憶體資源,同時還可以...
Python3 單例模式問題
單例模式,也叫單子模式,是一種常用的軟體設計模式,屬於建立型模式的一種。在應用這個模式時,單例物件的類必須保證只有乙個例項存在。許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取...
Python3安裝Matplotlib模組
matplotlib 是 python 的繪相簿。它可與 numpy 一起使用,提供了一種有效的 matlab 開源替代方案。它也可以和圖形工具包一起使用,如 pyqt 和 wxpython。開啟cmd,輸入語句 python m pip install u pip setuptools pytho...