Héritage de propriété

Le problème exposé dans ce sujet a été résolu.

Bonjour,

J'ai une classe Python qui représente un objet physique dont on peut changer la longueur (une tige qu'on peut allonger ou rétracter électroniquement).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class TigeAbstraite:

    def __init__(self, accuracy):
        self.accuracy = accuracy
        self._len = 0

    @property
    def len(self):
        return self._len

    @len.setter
    def len(self, l):
        dist = l - self.len

        if dist < 0:
            move = self.shorten
        elif dist > 0:
            move = self.lengthen
        else:
            return

        while abs(self.len - l) > self.accuracy:
            move()

Puis je crée une classe pour gérer les aspects concrets (carte électronique employée, moyens de mesure de la longueur, etc.). Du coup, le getter de _len dépend de cette classe fille, mais pas le setter qui n'est pas fonction de l'implémentation physique.

Sauf que j'ignore comment spécifier uniquement le getter dans ma classe fille. Je pourrais me passer des propriétés, mais ça me parait un peu dommage (à la base, j'avais deux méthodes : __len__ et set_len).

Merci.

+0 -0

Du coup, le getter de _len dépend de cette classe fille, mais pas le setter qui n'est pas fonction de l'implémentation physique.

On a donc une "abstract method". Et en python, ces méthodes sont "implémentatbles" de deux façons :

  • la méthode "avec des conventions" où tu mets juste le nom et ensuite tu fais pass
  • la méthode qui utilise les métaclasse et l'annotation @abstractmethode que tu peux trouver ici

Le problème, c'est que je ne parviens pas à découpler la fonction len décorée par @property de celle décorée par @len.property. Le code suivant provoque une erreur :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Mere:

    def __init__(self):
        self._arg = 3

    @property
    def arg(self):
        print('get_mere')
        return self._arg

    @arg.setter
    def arg(self, val):
        print('set')
        self._arg = val

class Fille(Mere):
    @property
    def arg(self):
        print('get_fille')
        return self._arg

if __name__ == '__main__':
    obj = Mere()
    print(obj.arg) # 3
    obj.arg = 2
    print(obj.arg) # 2
    obj.arg += 5
    print(obj.arg) # 7

    obj = Fille()
    print(obj.arg) # 3
    obj.arg = 2 # AttributeError: can't set attribute
    print(obj.arg)

Concernant les méthodes abstraites en général, cela vaut-il la peine de les mettre ?

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte