• # Ajout du Python ?

    Posté par (site web personnel) . En réponse au journal Article sur la programmation C++. Évalué à 2.

    Salut,

    Déjà, l'idée est très bonne et l'article est a l'air bon (pas trop le temps de le lire en détail là). Par contre, il serait intéressant de voir aussi les autres langages. Le principe est le même, mais chaque langage a ses spécificités.

    J'avais justement répondu à une demande sur IRC d'implémentation de singleton en Python. Le premier jet est le suivant :

    # Fichier pouet.py
    class _Pouet:
    def __init__(self):
    self.pouet = "Pouet!"
    print "Instancie"
    def Pouet():
    global _instance_pouet
    if _instance_pouet==None:
    _instance_pouet = _Pouet()
    return _instance_pouet
    _instance_pouet = None

    # Fichier test.py
    from pouet import Pouet
    x=Pouet()
    y=Pouet() # -> x==y et id(x)==id(y)

    J'ai écrit une fonction Pouet pour faire croire qu'on instancie une classe Pouet alors qu'en fait on appelle la méthode getInstance() de la classe _Pouet.

    Alternative, en utilisant un attribut privé (_instance) :

    # Fichier pouet2.py
    class _Pouet:
    _instance = None

    def __init__(self):
    assert self._instance == None
    self._instance = self
    self.pouet = "Pouet!"
    print "Instancie"

    def getInstance():
    if _Pouet._instance == None:
    _Pouet._instance = _Pouet()
    return _Pouet._instance
    getInstance = staticmethod(getInstance)

    def Pouet():
    return _Pouet.getInstance()

    # Fichier test2.py
    from pouet2 import Pouet
    x=Pouet()
    y=Pouet() # -> x==y et id(x)==id(y)

    Cet exemple est plus propre je pense.

    Voili voilou.
    Haypo
    PS: Oups, y'a pas moyen d'insérer du code en conservant l'indentation (<pre>) dans un commentaire LinuxFR, pas pratique pour le Python ...