CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Python et les classes.

ViIIeurbannais
ViIIeurbannais
Niveau 54
07 janvier 2017 à 12:55:52

Bonjour,
J'ai un petit problème avec un TD, je dois créer un "profil", donc pas de soucis je crée une classe nommée personne avec ses caractéristiques "nom, age, prénom", puis on me demande de créer une méthode qui transforme un profil en string pour l'affichage, je comprends pas bien la demande en faite, dans la question suivante on me demande d'afficher le profil mais cette fois ci en utilisant "format" dans ce cas pas de problème, est ce que pour transformer un profil en string il suffit de faire ce genre de chose dans la classe:
def affichage(self): print("Son nom est:", self.nom ) print("Son prenom est:", self.prenom)

Ou alors ça n'a rien avoir ??

J'ai une autre question, par exemple j'ai deux profils à comparer, comment je fais pour les comparer directement c'est à dire comparer ce qu'ils contiennent, exemple:
import ModulePersonne as MP a = MP.personne("Jules","Verne") b = MP.personne("Paul","Dupont")

Je peux faire des tests style: a.nom == b.nom, a.prenom == b.prenom ect mais ça peut être très très long s'il y a beaucoup de données, n'existe il pas un moyen de tester directement, d'avoir accès aux infos de chaque profil, car quand je fais par exemple: a.__dict__ ça ne me ressort pas les attributs définis dans la classe, comme "objets_crees" dans cet exemple:

https://openclassrooms.com/courses/apprenez-a-programmer-en-python/premiere-approche-des-classes#/id/r-2232958

Alors que je peux y accéder en faisant a.objets_crées, mais ça reviens à mon problème initial ça peut prendre bcp de temps et je dois à l'avance connaitre le nom des attributs.
J'ai trouvé une parade quand c'est moi qui créer la classe, mais si on me donne des classes dont je ne sais rien et que j'ai pas le droit de modifier je fais comment ?

Merci à l'avance.

Blaff5
Blaff5
Niveau 10
07 janvier 2017 à 16:31:48

Je pense que ton professeur veut t'initier aux méthodes "magiques" des classes Python : http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-6/

En gros, ce sont des méthodes avec un nom spécial (il y en a quelques dizaines) qui sont appelées par les autres fonctions ou opérateurs de Python.

Ces méthodes que tu peux déclarer à l'intérieur de ta classe permettent de définir le résultat lorsque tu appelleras par exemple del my_object, len(my_object), my_object + 1, x in my_object, etc.

C'est donc l'une de ces méthodes qui permet aussi de définir ce qui se passe lorsque tu feras print(my_person).
Dans ce cas, Python essayera d'appeler la méthode __repr__ de ta classe (si elle en possède), c'est celle qu'il faut que tu définisse.

def __repr__(self):
    return "Son nom est {}, son prénom est {}".format(self.nom, self.prenom)

C'est aussi cette méthode fonction qui est appelée lorsque tu utilises la méthode .format().

print("Ma personne: {}".format(my_person))

De même, il existe la méthode magique __eq__() qui permet de définir le résultat lorsque deux de tes objets sont comparés.

def __eq__(self, other):
    if self.nom == other.nom and self.prenom == other.prenom:
        return True
    else:
        return False

Tu pourras ainsi faire my_person_1 == my_person_2.

Généralement, tu n'as pas énormément d'attributs à comparer, donc il n'y a pas besoin d'avoir recours à des astuces comme comparer .__dict__ qui peut en plus être piégeux dans certains cas. Il faut donc mieux définir à la main quels sont les caractéristiques qui font que deux objets sont égaux.

Message édité le 07 janvier 2017 à 16:35:39 par Blaff5
ViIIeurbannais
ViIIeurbannais
Niveau 54
07 janvier 2017 à 20:27:18

Salut Blaff, merci pour ta réponse.

Le 07 janvier 2017 à 16:31:48 Blaff5 a écrit :
Je pense que ton professeur veut t'initier aux méthodes "magiques" des classes Python : http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-6/

En gros, ce sont des méthodes avec un nom spécial (il y en a quelques dizaines) qui sont appelées par les autres fonctions ou opérateurs de Python.

Ces méthodes que tu peux déclarer à l'intérieur de ta classe permettent de définir le résultat lorsque tu appelleras par exemple del my_object, len(my_object), my_object + 1, x in my_object, etc.

C'est donc l'une de ces méthodes qui permet aussi de définir ce qui se passe lorsque tu feras print(my_person).
Dans ce cas, Python essayera d'appeler la méthode __repr__ de ta classe (si elle en possède), c'est celle qu'il faut que tu définisse.

def __repr__(self):
    return "Son nom est {}, son prénom est {}".format(self.nom, self.prenom)

C'est aussi cette méthode fonction qui est appelée lorsque tu utilises la méthode .format().

print("Ma personne: {}".format(my_person))

:d) Oui, c'est ce que j'ai fait pour afficher avec "format", mais on me demande aussi d'afficher le profil en créant une méthode qui le transforme en string (sans utiliser format) c'est ça que je comprends pas.

De même, il existe la méthode magique __eq__() qui permet de définir le résultat lorsque deux de tes objets sont comparés.

def __eq__(self, other):
    if self.nom == other.nom and self.prenom == other.prenom:
        return True
    else:
        return False

Tu pourras ainsi faire my_person_1 == my_person_2.

Généralement, tu n'as pas énormément d'attributs à comparer, donc il n'y a pas besoin d'avoir recours à des astuces comme comparer .__dict__ qui peut en plus être piégeux dans certains cas. Il faut donc mieux définir à la main quels sont les caractéristiques qui font que deux objets sont égaux.

:d) Du coup, je mets cette méthode dans la classe ? J'ai pas bien compris.

Blaff5
Blaff5
Niveau 10
07 janvier 2017 à 20:57:10

Le 07 janvier 2017 à 20:27:18 ViIIeurbannais a écrit :
Salut Blaff, merci pour ta réponse.

Le 07 janvier 2017 à 16:31:48 Blaff5 a écrit :
Je pense que ton professeur veut t'initier aux méthodes "magiques" des classes Python : http://sametmax.com/le-guide-ultime-et-definitif-sur-la-programmation-orientee-objet-en-python-a-lusage-des-debutants-qui-sont-rassures-par-les-textes-detailles-qui-prennent-le-temps-de-tout-expliquer-partie-6/

En gros, ce sont des méthodes avec un nom spécial (il y en a quelques dizaines) qui sont appelées par les autres fonctions ou opérateurs de Python.

Ces méthodes que tu peux déclarer à l'intérieur de ta classe permettent de définir le résultat lorsque tu appelleras par exemple del my_object, len(my_object), my_object + 1, x in my_object, etc.

C'est donc l'une de ces méthodes qui permet aussi de définir ce qui se passe lorsque tu feras print(my_person).
Dans ce cas, Python essayera d'appeler la méthode __repr__ de ta classe (si elle en possède), c'est celle qu'il faut que tu définisse.

def __repr__(self):
    return "Son nom est {}, son prénom est {}".format(self.nom, self.prenom)

C'est aussi cette méthode fonction qui est appelée lorsque tu utilises la méthode .format().

print("Ma personne: {}".format(my_person))

:d) Oui, c'est ce que j'ai fait pour afficher avec "format", mais on me demande aussi d'afficher le profil en créant une méthode qui le transforme en string (sans utiliser format) c'est ça que je comprends pas.

Dans ce cas, il y existe aussi la méthode __str__() qui est celle appelée lorsque tu fais str(my_person).

De même, il existe la méthode magique __eq__() qui permet de définir le résultat lorsque deux de tes objets sont comparés.

def __eq__(self, other):
    if self.nom == other.nom and self.prenom == other.prenom:
        return True
    else:
        return False

Tu pourras ainsi faire my_person_1 == my_person_2.

Généralement, tu n'as pas énormément d'attributs à comparer, donc il n'y a pas besoin d'avoir recours à des astuces comme comparer .__dict__ qui peut en plus être piégeux dans certains cas. Il faut donc mieux définir à la main quels sont les caractéristiques qui font que deux objets sont égaux.

:d) Du coup, je mets cette méthode dans la classe ? J'ai pas bien compris.

Oui, de la même façon que tu as mis __repr__() dans ta classe, tu définis __eq__(self, other) comme une méthode de ta classe, et tu retournes le booléen selon que les deux objets partagent les mêmes attributs ou non.

ViIIeurbannais
ViIIeurbannais
Niveau 54
07 janvier 2017 à 22:07:45

Mais __str__ ça utilise .format aussi :(

J'ai pas utilisé __repr__(), je largué là je post mon code:

class personne:
 """classe personne:
 -Son nom
 -Son prenom
 -Son numero"""
 
 compte = 0
 
 def __init__(self,prenom,nom):
     personne.compte += 1
     self.prenom = prenom
     self.nom = nom
         
 def copie(self):
     q = personne()
     q.nom = self.nom
     q.prenom = self.prenom
     q.compte =  personne.compte
     return q

 def __eq__(self, other):
    if self.nom == other.nom and self.prenom == other.prenom:
        return True
    else:
        return False

Après je fais par exemple:

import modulepersonne as mp
a = mp.personne("bob","dede")
b = mp.personne("jules","didi")

Après je fais eq(a,b) dans le main ?

Blaff2
Blaff2
Niveau 10
07 janvier 2017 à 23:58:42

Quand je fais

def __repr__(self):
    return "Son nom est {}, son prénom est {}".format(self.nom, self.prenom)

la fonction .format() utilise la méthode __repr__() de tes objects self.nom et self.prenom. Après avoir appelé cette méthode, la fonction format les introduits à l'endroit indiqué par {}.
Dans le cas 'une chaîne de caractères "Paul" ou "Eluard", la méthode __repr__() retourne cette même chaîne donc c'est facile.

Le code que je t'ai donné est équivalent à :

def __repr__(self):
    return "Son nom est " + self.nom + ", son prénom est " + self.prenom

Quand tu implémentes __str__ tu peux utiliser .format() si tu le souhaites, mais ce n'est pas une nécessité.
Tu peux faire ce que tu veux.

def __str__(self):
    return "abc"

Dans ton main tu feras a == b.

ViIIeurbannais
ViIIeurbannais
Niveau 54
08 janvier 2017 à 16:37:28

Je dsl je comprends pas, je mets:
def __repr__(self): return "Son nom est " + self.nom + ", son prénom est " + self.prenom

Dans ma classe personne, et pour que ça m'affiche la phrase dans le main je fais quoi ?
J'ai essayé:
import Modulepersonne as Mp p = Mp.personne("Bibi","Paul") p.__repr__ mais rien ne s'affiche, je sais pas comment appeler.
Pareil pour la fonction __eq__ que j'ai défini dans la classe personne, si je fais a == b dans le main ça va juste me faire un test d'égalité classique qui ne fera pas intervenir la fonction __eq__.
Merci pour ton aide et ta patience en tout cas :-(

ViIIeurbannais
ViIIeurbannais
Niveau 54
08 janvier 2017 à 16:44:57

Je peux pas éditer mon message.
Pour le __repr__, j(ai trouvé, en faisant __repr__(p).

Mais pour __eq__ rien, j'ai essayé __eq__(a,b) ça ne donne rien.

Edit: Si c'est bon en faisant a.__eq__(b).

Merci

Message édité le 08 janvier 2017 à 16:46:15 par ViIIeurbannais
Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment