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://www.runoob.com/design-pattern/singleton-pattern.html