Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Définition dans une définition dans une classe ~)

2 réponses
Avatar
moky
Bonjour


J'ai une classe vecteur définie ainsi :

class vecteur(object):
def __init__(self,x,y):
self.x = x
self.y = y

def Affiche(self):
print "("+str(self.x)+","+str(self.y)+")"

def nom(self,nom):
print " est le vecteur "+nom


Quand je veux afficher ses coordonnées, j'ai la méthode "Affiche" qui
affiche les coordonnées :

V = vecteur(1,2)
V.Affiche()

donne le résultat escompté : (1,2).

De temps en temps, je voudrais afficher non seulement les coordonnées,
mais en plus un nom. C'est à ça que sert la méthode "nom" de la méthode
"Affiche"

Hélas,
V.Affiche().nom("A")
donne une erreur relativement prévisible :
AttributeError: 'NoneType' object has no attribute 'nom'

J'ai essayé pas mal de combinaisons. J'ai même essayé de faire de
Affiche une sous-classe de la classe vecteur, mais je me suis perdu en
mélanges de __init__ et de self.

Est-ce qu'il y a un moyen de faire en sorte que
V.Affiche()
donne "(1,2)"
et
V.Affiche().nom("A")
donne "(1,2) est le vecteur A"

??





En fin de compte, je suis parvenu à ceci :


#! /usr/bin/python
# -*- coding: utf8 -*-


class vecteur(object):

class _Affiche(object):
def __init__(self,vect):
self.vect = vect
print "("+str(self.vect.x)+","+str(self.vect.y)+")"

def nom(self,nom):
print " est le vecteur "+nom
print "et encore : "
self.vect.Affiche()

def __init__(self,x,y):
self.x = x
self.y = y

def Affiche(self):
return self._Affiche(self)

V = vecteur(1,2)
V.Affiche()
V.Affiche().nom("A")


Cela fait ce que je veux, mais j'ai des doutes quant à la pythonicité de
l'idée.
En particulier, je ne pourrais pas, de cette manière, faire en sorte que
V.Affiche() n'affiche pas (1,2), mais à la place *retourne* la chaine
"(1,2)".


Merci si vous avez des avis
Bonne aprème
Laurent

2 réponses

Avatar
Alain BARTHE
Tu peux essayer ça :

class Vecteur (object):

def __init__ (self,x,y,nom):
self.x = x
self.y = y
seld.nom = nom

def __repr__ (self):
return "%s = (%d,%d)" % (self.nom, self.x, self.y)

v = Vecteur (10,10, "V1")
print v

Ca devrait ressembler a ce que tu desires.



Bonjour


J'ai une classe vecteur définie ainsi :

class vecteur(object):
def __init__(self,x,y):
self.x = x
self.y = y

def Affiche(self):
print "("+str(self.x)+","+str(self.y)+")"

def nom(self,nom):
print " est le vecteur "+nom


Quand je veux afficher ses coordonnées, j'ai la méthode "Affiche" qui
affiche les coordonnées :

V = vecteur(1,2)
V.Affiche()

donne le résultat escompté : (1,2).

De temps en temps, je voudrais afficher non seulement les coordonnées,
mais en plus un nom. C'est à ça que sert la méthode "nom" de la méthode
"Affiche"

Hélas,
V.Affiche().nom("A")
donne une erreur relativement prévisible :
AttributeError: 'NoneType' object has no attribute 'nom'

J'ai essayé pas mal de combinaisons. J'ai même essayé de faire de
Affiche une sous-classe de la classe vecteur, mais je me suis perdu en
mélanges de __init__ et de self.

Est-ce qu'il y a un moyen de faire en sorte que
V.Affiche()
donne "(1,2)"
et
V.Affiche().nom("A")
donne "(1,2) est le vecteur A"

??





En fin de compte, je suis parvenu à ceci :


#! /usr/bin/python
# -*- coding: utf8 -*-


class vecteur(object):

class _Affiche(object):
def __init__(self,vect):
self.vect = vect
print "("+str(self.vect.x)+","+str(self.vect.y)+")"

def nom(self,nom):
print " est le vecteur "+nom
print "et encore : "
self.vect.Affiche()

def __init__(self,x,y):
self.x = x
self.y = y

def Affiche(self):
return self._Affiche(self)

V = vecteur(1,2)
V.Affiche()
V.Affiche().nom("A")


Cela fait ce que je veux, mais j'ai des doutes quant à la pythonicité de
l'idée.
En particulier, je ne pourrais pas, de cette manière, faire en sorte que
V.Affiche() n'affiche pas (1,2), mais à la place *retourne* la chaine
"(1,2)".


Merci si vous avez des avis
Bonne aprème
Laurent














Avatar
NicolasP
Bonjour,

moky a écrit :
Bonjour


J'ai une classe vecteur définie ainsi :

class vecteur(object):
def __init__(self,x,y):
self.x = x
self.y = y

def Affiche(self):
print "("+str(self.x)+","+str(self.y)+")"

def nom(self,nom):
print " est le vecteur "+nom


Quand je veux afficher ses coordonnées, j'ai la méthode "Affiche" qui
affiche les coordonnées :

V = vecteur(1,2)
V.Affiche()

donne le résultat escompté : (1,2).

De temps en temps, je voudrais afficher non seulement les coordonnées,
mais en plus un nom. C'est à ça que sert la méthode "nom" de la méthode
"Affiche"

Hélas,
V.Affiche().nom("A")
donne une erreur relativement prévisible :
AttributeError: 'NoneType' object has no attribute 'nom'

J'ai essayé pas mal de combinaisons. J'ai même essayé de faire de
Affiche une sous-classe de la classe vecteur, mais je me suis perdu en
mélanges de __init__ et de self.

Est-ce qu'il y a un moyen de faire en sorte que
V.Affiche()
donne "(1,2)"
et
V.Affiche().nom("A")
donne "(1,2) est le vecteur A"

??


Attention, l'instruction print génère un retour à la ligne suivante.
Donc, l'enchainement des 2 fonctions génèrerait un affichage sur 2 lignes.


Pourquoi pas ça ? :

class vecteur(object):
def __init__(self,x,y):
self.x = x
self.y = y

def Affiche(self, nom=""):
if nom :
n = "est le vecteur %s" % nom
else :
n = ""
print "(%d,%d) %s" % (self.x, self.y, n)


V = vecteur(1,2)
V.Affiche()
donne "(1,2)"
V.Affiche("A")
donne "(1,2) est le vecteur A"

C'est plus simple et c'est pythonesque.

Comme tu peux le voir, j'ai remplacé
"("+str(self.x)+","+str(self.y)+")"
par
"(%d,%d)" % (self.x, self.y)

Accessoirement, j'ai modifié le tout pour obtenir le résultat que tu désires.

C'est plus simple à lire et plus pythonesque.

Nicolas