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 :

Surchage de l'opérateur * avec __mul__ pour une classe de vecteur [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut Surchage de l'opérateur * avec __mul__ pour une classe de vecteur
    Bonjour.
    Pour un vecteur, l'opérateur * peut concerner un produit matriciel (v1 * v2) ou un produit scalaire (x * v1 ou v1 * x).
    Pour un vecteur 2d, j'arrive à coder l'un ou l'autre des produits mais pas les 2 en même temps :
    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
    class Vector:
        def __init__(self, x=0, y=0):
            self.x = x
            self.y = y
     
        def __repr__(self):
            return "Vector(" + str(self.x) + "," + str(self.y) + ")"
     
        def __mul__(self, scalar):
            return Vector(scalar * self.x,scalar * self.y)
     
        def __rmul__(self, scalar):
            return self * scalar
     
        # def __mul__(self, other):
          #  return self.x * other.x + self.y * other.y
    Ici, le produit scalaire fonctionne jusqu'à ce que je décommente le produit matriciel. Idem, le produit matriciel fonctionne si je commente les 2 produits scalaires.
    Est-il possible de surcharger * pour que les 3 opérations fonctionnent ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Salut,

    Citation Envoyé par ypcman Voir le message
    Est-il possible de surcharger * pour que les 3 opérations fonctionnent ?
    Non et Python n'admet pas comme C++ une surcharge différentiable par le type des arguments. Par contre, rien ne vous empêche de tester par vous même si l'argument est vecteur ou scalaire.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par ypcman Voir le message
    Pour un vecteur 2d, j'arrive à coder l'un ou l'autre des produits mais pas les 2 en même temps :
    Est-il possible de surcharger * pour que les 3 opérations fonctionnent ?
    Code python : 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
    class Vector:
    	def __init__(self, x=0, y=0):
    		self.x = x
    		self.y = y
     
    	def __str__(self):
    		return "Vector({0}, {1})".format(self.x, self.y)
     
    	def __mul__(self, other):
    		if isinstance(other, Vector):
    	  		return self.x * other.x + self.y * other.y
    		return Vector(other * self.x, other * self.y)
     
    	def __rmul__(self, other):
    		return self * other
    # class Vector
    Et essaye si possible de ne pas surcharger "__repr__", c'est une fonction qui a pour but de montrer une chose "du point de vue de Python". C'est dommage donc de changer artificiellement ce point de vue, ça le dénature...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Et essaye si possible de ne pas surcharger "__repr__", c'est une fonction qui a pour but de montrer une chose "du point de vue de Python". C'est dommage donc de changer artificiellement ce point de vue, ça le dénature...
    Le __repr__ du PO est conforme à ce qu'on attend non? voir la documentation.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    Merci pour vos réponses, c'est parfait.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/01/2008, 08h32
  2. Réponses: 6
    Dernier message: 11/09/2007, 18h17
  3. Opérateur new pour une classe personalisée.
    Par méphistopheles dans le forum C++
    Réponses: 15
    Dernier message: 25/05/2007, 07h26
  4. Réponses: 6
    Dernier message: 03/05/2007, 11h28
  5. Count de variable avec separateur pour une meme ligne
    Par snanot dans le forum Langage SQL
    Réponses: 8
    Dernier message: 19/02/2007, 17h11

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