Bonjour,

Je suis en train de tester 2 solutions pour faire un Singleton : par métaclasse, et par décorateur.

Si la métaclasse fonctionne bien, j'ai un truc bizarre avec le décorateur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def singleton(cls):
    instances = {}
    def getinstance():
        if cls not in instances:
            instances[cls] = cls()
        return instances[cls]
    return getinstance
 
@singleton
class MyClass(object):
    def __init__(self):
        super(MyClass, self).__init__()
        self.a = 1
 
MyClass()
car j'obtiens :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
Traceback (most recent call last):
  File "deco.py", line 17, in <module>
    MyClass()
  File "deco.py", line 5, in getinstance
    instances[cls] = cls()
  File "deco.py", line 13, in __init__
    super(MyClass, self).__init__()
TypeError: must be type, not function
Quelqu'un peut-il m'expliquer ce qui se passe, exactement ? Je n'arrive pas à suivre le cheminement de python lors de la création/initialisation de la classe... J'imagine qu'une fois compris ça, la réponse coule se source

Merci d'avance.