El patrón singleton del patrón de diseño de Python: realice el singleton del registrador

1. Introducción al modo Singleton

Descripción general: requiere una sola instancia de una clase y proporciona un punto de acceso global.

Escenarios de aplicación: grupos de recursos como inserción de registros, temporizadores, verificación de permisos, papeleras de reciclaje, contadores de sitios web, grupos de subprocesos, grupos de conexiones de bases de datos, etc.

 

 En segundo lugar, la realización del registrador de registros.

El proceso de instanciación de un objeto es ejecutar la clase __new__方法primero, si no lo escribimos, el __new__método del objeto será llamado por defecto , devolviendo un objeto instanciado y luego llamando __init__方法para inicializar este objeto, podemos implementar un singleton basado en esto.

__new__方法中Primero juzgue si hay una instancia en una clase , si hay una instancia, regresará directamente, si no hay una instancia, será creada.

# 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************")

La salida de la consola es la siguiente:

566521222648 logger2.log
566521222648 logger2.log

Genere un archivo logger2.log, el contenido del archivo es el siguiente:

[INFO] log1 ************ 
[WARN] log1 ************ 
[INFO] log2 ************ 
[WARN ] log2 ************

Los resultados muestran que: el contenido de la información del registro se registra en el mismo archivo

 

Referencia

[Wessel Badenhorst] Patrones prácticos de diseño de Python: Solución pirónica a problemas comunes

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% 88 Singleton% EF% BC% 89

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

Supongo que te gusta

Origin blog.csdn.net/qq_40602000/article/details/106573829
Recomendado
Clasificación