slots, héritage, références
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:
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:
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:
__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.