Le modèle singleton du modèle de conception Python - réalisez le singleton de l'enregistreur

1. Introduction au mode Singleton

Vue d'ensemble: nécessite une et une seule instance d'une classe et fournit un point d'accès global.

Scénarios d'application: pools de ressources tels que l'insertion de journaux, les minuteries, la vérification des autorisations, les corbeilles, les compteurs de sites Web, les pools de threads et les pools de connexions à la base de données.

 

 Deuxièmement, la réalisation de l'enregistreur de journal

Le processus d'instanciation d'un objet consiste à exécuter la classe en __new__方法premier.Si nous ne l'écrivons pas, la __new__méthode objet sera appelée par défaut , retournant un objet instancié, puis appelant __init__方法pour initialiser cet objet.Nous pouvons implémenter un singleton basé sur cela.

__new__方法中Jugez d'abord s'il y a une instance dans une classe , s'il y a une instance, elle retournera directement, s'il n'y a pas d'instance, elle sera créée.

# 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 sortie de la console est la suivante:

566521222648 logger2.log
566521222648 logger2.log

Générez un fichier logger2.log, le contenu du fichier est le suivant:

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

Les résultats montrent que: le contenu des informations du journal est enregistré dans le même fichier

 

Référence

[Wessel Badenhorst] Modèles de conception Python pratiques : Solution pyrhonique aux problèmes courants

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

Je suppose que tu aimes

Origine blog.csdn.net/qq_40602000/article/details/106573829
conseillé
Classement