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 ;
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()
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()
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
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
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
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!