OVH Cloud OVH Cloud

Heritage de methode

31 réponses
Avatar
Francois
Bonjour,

J'ai une classe 'Vecteur' qui m'intéresse et à laquelle je souhaite
rajouter quelques méthodes.
Comme cette classe est 'figée' et que je ne peux pas y toucher, j'ai
pensé créer une classe 'MonVecteur' qui dérive de cette classe et à
laquelle je rajoute mes propres méthodes.

En particulier je souhaiterais néanmoins que 'MonVecteur' dispose des
mêmes méthodes que 'Vecteur', pour les additions, les
multiplications, les normalisations, etc...
Le problème est que ces méthodes _créent_ un objet de classe 'Vecteur'
et non pas 'MonVecteur' lorsque j'essaye par exemple d'additioner deux
objets de classe 'MonVecteur'.

J'espère avoir été clair, donc si quelqu'un avait une idée pour
résoudre mon problème...

Merci d'avance,

1 réponse

1 2 3 4
Avatar
Francois
On Mon, 28 Nov 2005 19:17:37 +0100, bruno at modulix


Un bémol: si la classe Vector est codée en C et ne respecte pas
pleinement le fonctionnement des classes "newstyle", je ne
garantis rien.




Tu n'as pas bien compris ce que je voulais dire. Voici un example
de classe Vecteur :

class Vecteur:
def __init__(self, x, y, z):
self.x, self.y, self.z = x,y,z
def scale(self, scale):
return Vecteur(self.x*scale, self.y*scale, self.z*scale)




BTW, j'en profite pour recommander la BonnePratique(tm) suivante :
ne pas coder le nom de la classe en dur dans le code. Christophe
n'aurait pas ce problème si scale() avait été implémenté ainsi:

def scale(self, scale):
return self.__class__(self.x*scale, self.y*scale,
self.z*scale)



Facile à dire.

class MonVecteur(Vecteur):
def affiche_valeur(self):
print "MonVecteur : ", self.x, self.y, self.z

a = MonVecteur(1,2,3)
b = a.scale(10)
b.affiche_valeur() # Erreur : pas un MonVecteur




Christophe, j'ai *parfaitement* compris ce que tu voulais dire !-)

Et je maintiens que c'est facile à résoudre d'une façon générique
(ie: sans devoir tout recoder à la main) en utilisant la
délégation et __getattr__. (NB : au bémol ci-dessus près)



Dans le cas ou Vecteur est déjà écrite de façon incorrecte, je suis
curieux de voir comment tu t'en sors ;)



[snip le code de compétition]

Je viens juste de récupérer ma connexion, je n'ai pu suivre la
discussion qu'en tant que spectateur...

Merci énormément à tous pour cette aide précieuse et surtout à Bruno
pour cette élégante solution. Je ne connaissais rien à la délégation et
je vais m'y mettre sérieusement !
Décidément Python m'étonnera toujours...





1 2 3 4