Singleton en Python : Gestion des Instances Uniques

Le pattern singleton est un design pattern qui garantit qu'une classe possède une seule instance et offre un point d'accès centralisé. En Python, il offre plusieurs avantages clés pour la conception logicielle.

Les principaux bénéfices sont :

  • Optimisation des ressources : En limitant la création d'objets répétitifs, il réduit la consommation mémoire et les charges de calcul.
  • Cohérence dans les environnements concurrents : Il assure une initialisation unique des variables globales, évitant les conflits de données en contexte multithread.
  • Contrôle d'accès simplifié : Il fournit un mécanisme d'accès uniforme, permettant une gestion centralisée de l'instance.

Implémentation de base du singleton

class InstanceUnique:
    _instance_singuliere = None

    def __new__(cls, *args, **parametres):
        if cls._instance_singuliere is None:
            cls._instance_singuliere = super().__new__(cls)
        return cls._instance_singuliere

    def __init__(self):
        # Logique d'initialisation personnalisée
        pass

# Test de l'unicité
objet_a = InstanceUnique()
objet_b = InstanceUnique()
print(objet_a is objet_b)  # Affiche True

Cas d'usage : Configuration du driver Appium

Dans les applications utilisant Appium, le singleton peut centraliser la configuration du webdirver. L'exemple suivant montre une classe qui charge un fichier YAML pour initialiser un driver distant unique.

# config_pilote.py
import os.path
from appium import webdriver
from config import utilitaire_yaml
from config.chemins import chemin_projet

class ConfigPilote(object):
    _instance_unique = None

    def __new__(cls, *args, **parametres):
        if not hasattr(cls, '_instance_unique'):
            parent = super(ConfigPilote, cls)
            chemin_fichier = os.path.join(chemin_projet, "config\config.yaml")
            donnees = utilitaire_yaml.lire_configuration_yaml(chemin_fichier)
            cls._instance_unique = parent.__new__(cls)
            cls._instance_unique.moteur = webdriver.Remote(
                "http://127.0.0.1:4723/wd/hub", donnees["capacites_souhaitees"]
            )
        return cls._instance_unique

class ClientPilote(ConfigPilote):
    def recuperer_moteur(self):
        return self.moteur

La méthode __new__ vérifie l'existence d'une instance via hasattr. Si aucune instance n'existe, elle charge les données du fichier YAML, crée un objet unique et initialise le moteur webdriver avec les paramètres spécifiés. Cette approche garantit que toutes les composantes de l'application partagent la même connexion au serveur Appium, assurant ainsi la cohérence et évitant les redodnances.

Étiquettes: Python Singleton Appium WebDriver YAML

Publié le 1 juin à 16h28