Python設計模式之單例模式 -- 實現日誌記錄器單例

一、單例模式簡介

概述:要求一個類有且僅有一個實例,並且提供了一個全局的訪問點。

應用場景:日誌插入、計時器、權限校驗、回收站、網站計數器、線程池、數據庫連接池等資源池。

 

 二、日誌記錄器的實現

一個對象的實例化過程是先執行類的__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://blog.csdn.net/Burgess_zheng/article/details/86762248#%C2%A0%20%C2%A0%C2%A0%20%C2%A0%20%C2%A05.%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%EF%BC%88Singleton%EF%BC%89

https://www.runoob.com/design-pattern/singleton-pattern.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章