IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Sucharge de methode


Sujet :

Python

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Août 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 81
    Points : 71
    Points
    71
    Par défaut Sucharge de methode
    Bojnour,
    Voila mon problème
    j'ai crée la classe Vector comme donné dans la Faq du site
    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
    20
    21
    22
    23
    24
    25
    # -*- coding: cp1252 -*-
     
    import math
     
    class Vector:
        def __init__(self, x=0, y=0):
            self.x=x
            self.y=y
        def __eq__(self, vB):
            return (self.x==vB.x) and (self.y==vB.y)    ## test l'égalité de 2 vecteurs        
        def __add__(self, vB):
            return Vector(self.x+vB.x,self.y+vB.y)  ## retourne le vecteur somme
        def __sub__(self, vB):
            return Vector(self.x-vB.x,self.y-vB.y) ## retourne le vecteur différence
        def __mul__(self, c):
            if isinstance(c,Vector):
                return  self.x*c.x+self.y*c.y ## retourne le produit scalaire
            else:
                return Vector(c*self.x,c*self.y) ## retourne le vecteur multiplé par un scalaire
        def __div__(self, c):
            return Vector(self.x/c, self.y/c) ## retourne le vecteur ayant subi une division scalaire
        def __abs__(self):
            return math.hypot(self.x, self.y) ## retourne la norme2 du vecteur
        def __str__(self):
            return '('+str(self.x)+','+str(self.y)+')' ## retourne la réprésentation du vecteur sous forme d'une chaîne
    Apres je fait:
    >> a = Vector(2,3)
    >>b = Vector(3,4)
    >>c = a + b

    Tout passe sans probleme
    Par contre je voudrais faire:
    >>a = Vector(2,3)
    >>a = 2
    >>b = Vector(3,4)
    >>c = a + b
    et la ca marche pas ce qui est normal car la methode __add__ elle n'est pas defini pour faire Vector + float
    Mais ma question est sur les 2 premieres lignes, quelle methode je dois surcharger pour quand je fais a = 2 il me change pas le type de a et le garde en vector et en fait me ferais un a = Vector(2,2)

    Merci d'avance de vos reponses
    Jonathan

  2. #2
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Salut,

    lorsque tu fais tu affectes 2 à la variable a, l'ancienne affectation a = Vector(2, 3) n'existe plus; a pointe vers une nouvelle adresse memoire, id(a) te donne l'adresse memoire vers laquelle pointe la variable a.
    Il te faudrait créer, par exemple, une methode setValue dans ta classe Vector, chargée de faire l'affectation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a = Vector(2, 3)
    a.setValue(2)
    Cela repond-t-il à ta question?
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Août 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 81
    Points : 71
    Points
    71
    Par défaut
    Merci deja pour ta reponse
    Mais cela repond en partie a ma question:
    Je veux bien definir un methode setValue ou j'aurais pu aussi cree une fonction InitVector() qui permet de te creer un vecteur genre
    a = InitVector(2)
    Mais je comprends pas pourquoi on peut surcharger toutes les methodes sauf l'instanciation
    Pourquoi quand on fait a = 2 il n'y a pas de methode genre __set__ qui permetrrais de faire un truc comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def __ set__(self,value)
       if type(value)=float
          self.x = value 
          self.y = value
    Il n'y a vraiment aucun moyen ???
    Merci beaucou

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Je ne pense pas qu'une telle méthode existe, pusiqu'on perdrait le typage dynamique des objets, ce qui conduirait à un joli mélange bien explosif à mon avis

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Août 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 81
    Points : 71
    Points
    71
    Par défaut
    je suis d'accord avec le probleme de typage dynamique mais si on voulait rester dans le meme monde (c'est a dire mode vecteur par exemple) ca me serait bien utile

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JUnit] Pour tester les methodes d'acces à une sgdb
    Par yanis97 dans le forum Tests et Performance
    Réponses: 2
    Dernier message: 15/04/2004, 15h55
  2. [debutant] [servlets] methode init()
    Par be_on_edge dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 01/03/2004, 15h11
  3. [METHODE] -> Détection de virus ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/02/2004, 17h04
  4. Passage de variable par methode post ?
    Par oazar dans le forum Flash
    Réponses: 33
    Dernier message: 16/10/2003, 17h03
  5. Methode de drcherche a l,interieur de basse de donner texte
    Par philippe V dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 03/12/2002, 10h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo