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...
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:
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...
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:
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...
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:
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...