一、單例模式簡介
概述:要求一個類有且僅有一個實例,並且提供了一個全局的訪問點。
應用場景:日誌插入、計時器、權限校驗、回收站、網站計數器、線程池、數據庫連接池等資源池。
二、日誌記錄器的實現
一個對象的實例化過程是先執行類的__new__方法
,如果我們沒有寫,默認會調用object的__new__
方法,返回一個實例化對象,然後再調用__init__方法
,對這個對象進行初始化,我們可以根據這個實現單例.
在一個類的__new__方法中
先判斷是不是存在實例,如果存在實例,就直接返回,如果不存在實例就創建.
# coding=utf-8
class Singleton(object):
"""
單例類
"""
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls) # python3
# cls._instance = super(Singleton, cls).__new__(cls,*args, **kwargs) # python2
return cls._instance
class Logger(Singleton):
"""
日誌
"""
def __init__(self, file_name):
self.filename = file_name
def _write_log(self, level, msg):
with open(self.filename, "a") as log_file:
log_file.write("[{0}]{1}\n".format(level, msg))
def critical(self, msg):
self._write_log("CRITICAL", msg)
def error(self, msg):
self._write_log("ERROR", msg)
def warn(self, msg):
self._write_log("WARN", msg)
def info(self, msg):
self._write_log("INFO", msg)
def debug(self, msg):
self._write_log("DEBUG", msg)
if __name__ == '__main__':
log1 = Logger("logger1.log")
log2 = Logger("logger2.log")
print(id(log1), log1.filename)
print(id(log2), log2.filename)
log1.info("log1************")
log1.warn("log1************")
log2.info("log2************")
log2.warn("log2************")
控制檯輸出如下:
566521222648 logger2.log
566521222648 logger2.log
生成一個logger2.log文件,文件內容如下:
[INFO]log1************ [WARN]log1************ [INFO]log2************ [WARN]log2************
結果表明:日誌信息內容記錄在同一個文件中
參考資料
[Wessel Badenhorst]Practical Python Design Patterns:Pyrhonic Solution to Common Problems
https://blog.csdn.net/sxb0841901116/article/details/78506643
https://www.runoob.com/design-pattern/singleton-pattern.html