Maison > développement back-end > Tutoriel Python > Qu'est-ce que le modèle python singleton

Qu'est-ce que le modèle python singleton

(*-*)浩
Libérer: 2020-09-18 15:02:57
original
9501 Les gens l'ont consulté

En Python, le modèle singleton est un modèle de conception logicielle couramment utilisé. L'objectif principal de ce modèle est de garantir qu'une certaine classe ne peut avoir qu'un seul objet d'instance en mémoire ; . Une classe n'a qu'un seul objet d'instance dans le processus en cours. Le modèle singleton est divisé en : 1. Style paresseux, créant des objets dès que la classe est chargée ; 2. Style affamé, créant des objets uniquement lorsqu'ils sont utilisés ;

Qu'est-ce que le modèle python singleton

Singleton Pattern est un modèle de conception de logiciel couramment utilisé. L'objectif principal de ce modèle est de garantir qu'une seule instance d'une certaine classe existe. Les objets Singleton sont utiles lorsque vous souhaitez qu'une seule instance d'une certaine classe apparaisse dans l'ensemble du système.

Par exemple, les informations de configuration d'un programme serveur sont stockées dans un fichier et le client lit les informations du fichier de configuration via une classe AppConfig. Si le contenu du fichier de configuration doit être utilisé à plusieurs endroits lors de l'exécution du programme, c'est-à-dire que des instances de l'objet AppConfig doivent être créées à plusieurs endroits, ce qui conduira à l'existence de plusieurs objets d'instance AppConfig. dans le système, ce qui gaspillera sérieusement les ressources mémoire, surtout si le fichier de configuration contient beaucoup de contenu. En fait, pour une classe comme AppConfig, nous espérons qu'un seul objet instance existe pendant l'exécution du programme.

Il y a trois points principaux du modèle singleton : Premièrement, une classe ne peut avoir qu'une seule instance, deuxièmement, elle doit créer cette instance par elle-même, elle doit la fournir au ; système entier par lui-même Exemple.

En Python, nous pouvons utiliser diverses méthodes pour implémenter le modèle singleton :

Utiliser des modules

Utiliser __new__

Utilisez des décorateurs

Utilisez des modules

En fait, les modules Python sont des modèles singleton naturels.

Car lorsque le module est importé pour la première fois, un fichier .pyc sera généré. Lors de sa deuxième importation, le fichier .pyc sera chargé directement sans réexécuter le code du module. Par conséquent, il suffit de définir les fonctions et données pertinentes dans un module pour obtenir un objet singleton.

Si nous voulons vraiment une classe singleton, pensez à faire ceci :

#tests1.py
class MyClass(object):
    def foo(self):
        print('MyClass.foo')
my_class_obj=MyClass()
Copier après la connexion

Enregistrez le code ci-dessus dans le fichier tests1.py et utilisez-le comme ceci :

from .tests1 import my_class_obj
my_class_obj.foo()
Copier après la connexion

Utiliser __new__

Afin de ne faire apparaître qu'une seule instance de la classe, nous pouvons utiliser __new__ pour contrôler le processus de création de l'instance. Le code est le suivant :

class MyClass(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(MyClass, cls).__new__(cls, *args, **kwargs)
        return cls._instance
 
class HerClass(MyClass):
    a = 1
Copier après la connexion

Dans le code ci-dessus, nous associons l'instance de la classe à une variable de classe _instance. Si cls._instance vaut None, créons l'instance, sinon renvoyons directement cls._instance.

L'exécution est la suivante :

one = HerClass()
two = HerClass()
print(one == two)   #True
print(one is two)   #True
print(id(one), id(two)) #42818864 42818864
Copier après la connexion

Utiliser le décorateur

Nous savons que le décorateur peut être modifié dynamiquement La fonctionnalité de une classe ou une fonction. Ici, on peut aussi utiliser un décorateur pour décorer une classe afin qu'elle ne puisse générer qu'une seule instance. Le code est le suivant :

from functools import wraps
def singleton(cls):
    instances = {}
 
    @wraps(cls)
    def getinstance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
 
    return getinstance
 
@singleton
class MyClass(object):
    a = 1
Copier après la connexion

Ci-dessus, nous avons défini un singleton décorateur, qui renvoie une fonction interne getinstance , ceci. La fonction déterminera si une certaine classe est dans les instances du dictionnaire. Si elle n'existe pas, cls sera utilisée comme clé et cls(*args, **kw) sera stockée comme valeur dans les instances. ] sera restitué directement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal