Salut,

J'ai fait quelques tests avec les slots, même si pour le moment j'en ai pas trop besoin, peut-être ultérieurement.
Bon pour être franc le modèle objet python, j'aime bien certains aspects, mais d'autres je déteste.

Le fonctionnement lors de l'héritage des slots me laisse vraiment circonspect à tel point que je me demande s'il y a vraiment des programmeurs qui les utilisent vu les contraintes que cela engendre.

Si on fait un truc basique, ok, c'est cool, ça fonctionne.

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
16
class A :
    __slots__ = ['_var']
    def __init__(self, valeur) : 
        self._var = valeur
 
    @property
    def var(self) :
        return self._var
 
class B(A) :
    def __init__(self, valeur) :
        A.__init__(self, valeur)
 
a = A('A')
b = B('B')
print(a.var, b.var) # A, B
Mais dès lors, que l'on veut un peu complexifier.

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
16
17
18
19
class A :
    __slots__ = {'_var':None}
    def __init__(self, valeur) :
        self.__slots__['_var'] = valeur
 
    def __setattr__(self, cle, valeur) :
        raise NotImplementedError
 
    @property
    def var(self) :
        return self.__class__.__slots__['_var']
 
class B(A) :
    def __init__(self, valeur) :
        A.__init__(self, valeur)
 
a = A('A')
b = B('B')
print(a.var, b.var) # B, B ...
Ok, la doc est claire, faut ajouter __weakreference__ aux classes filles pour avoir un fonctionnement correct.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
__slots__ = {'__weakreference__':None}
Mais c'est moisi non ce truc ?
Y'a pas un subterfuge pour induire ce comportement depuis la classe mère ?

Et d'ailleurs, je me demande si on ne pourrait pas se servir de ce comportement de références implicite comme singleton.