通常,我們根據需要創建許多類的對象。有時,創建多個對象可能會佔用大量資源。
實際示例可以是數據庫連接類。您不希望有多個數據庫對象,因為一個對象的更改可能會使其他對象不一致。
在這種情況下,我們可以使用單例模式。使用單例模式,我們確保一個類僅創建一個實例。
有幾個單例Python中經常使用的,其中包括None,True,和False。事實None是,允許您比較None使用is關鍵字的單例情況。
在Python中,創建單例模式的典型方法是使用裝飾器。您可以閱讀Python中的裝飾器一文,以瞭解有關裝飾器的更多信息。
假設我們希望在應用程序的整個生命週期中建立一個數據庫連接。讓我們創建一個單例類來實現我們的目的。
class Singleton:
def __init__(self, cls):
self._cls = cls
def Instance(self):
try:
return self._instance
except AttributeError:
self._instance = self._cls()
return self._instance
def __call__(self):
raise TypeError('Singletons must be accessed through `Instance()`.')
def __instancecheck__(self, inst):
return isinstance(inst, self._cls)
現在,創建數據庫連接類:
@Singleton
class DBConnection(object):
def __init__(self):
"""Initialize your database connection here."""
pass
def __str__(self):
return 'Database connection object'
讓我們訪問此連接類:
c1 = DBConnection.Instance()
c2 = DBConnection.Instance()
print("Id of c1 : {}".format(str(id(c1))))
print("Id of c2 : {}".format(str(id(c1))))
print("c1 is c2 ? " + str(c1 is c2))
輸出:
Id of c1 : 139699882512960
Id of c2 : 139699882512960
c1 is c2 ? True
如果執行以下操作,我們將得到TypeError:
try:
p = DBConnection()
except TypeError as ex:
print("ERROR: {}".format(ex.message))
我希望本文能幫助您在任何類中實現單例模式。
翻譯自:https://medium.com/better-programming/singleton-in-python-5eaa66618e3d
閱讀更多 開心人開發世界 的文章