Résolue

__str__ ou __repr__

# Méthodes # Orienté objet

Petite question,

j'ai bien lu l'article "à quoi sert le __str__". Si j'ai bien compris __str__ et __repr__ les deux méthodes permettent d'afficher en chaine de caractère un object, l'une ou l'autre devrait renvoyer le même résultat. alors pourquoi ici non ?


def __str__(self):
    return self.prenom +" " + self.nom

ici j'ai un retour type object


def __repr__(self):
    return self.prenom +" " + self.nom


ici j'ai bien le résultat escompté.


Salut Mehdi,


peux tu me mettre une capture de ta classe et aussi de tes différents tests où tu vois un résultat différent entre str et repr.

Tu es sur Django ? 


* Sans la methode str ou repr


#+begin_src python :results output
class User:

  def __init__(self, nom, prenom):
    self.nom = nom
    self.prenom = prenom
     
user = User("Dupond", "Jean")
print(user)
#+end_src
#+RESULTS:
: <__main__.User object at 0x100f16f10>


* Avec str


#+begin_src python :results output
class User:

  def __init__(self, nom, prenom):
    self.nom = nom
    self.prenom = prenom
     
  def __str__(self):
    return f"{self.nom} {self.prenom}"

user = User("Dupond", "Jean")
print(user)
#+end_src
#+RESULTS:
: Dupond Jean


* Avec repr


#+begin_src python :results output
class User:

  def __init__(self, nom, prenom):
    self.nom = nom
    self.prenom = prenom
     
  def __repr__(self):
    return f"{self.nom} {self.prenom}"

user = User("Dupond", "Jean")
print(user)
#+end_src
#+RESULTS:
: Dupond Jean


Les 2 str et repr donnent bien le même output.

Peut être un pb d'indentation ?


N'hésite pas si tu as toujours un problème.

Thibault houdon

Mentor

Salut Mehdi !


Je te conseille également la lecture des deux glossaires avec notamment un récapitulatif de tous les cas de figure et le résultat que cela donne en fonction de si ta classe contient __str__, __repr__ ou les deux :

https://www.docstring.fr/glossaire/str/

https://www.docstring.fr/glossaire/repr/

Ok au risque de paraitre un peu lourd, a quoi servent ces méthodes si on utilise le décorateur @dataclasse qui si j'ai bien suivie inclut la méthode __repr__


from dataclasses import dataclass
class Entreprise:
    nom = "Docstring"
    employes = []

@dataclass
class Employe:
    prenom: str
    nom: str
    position: str
    salaire: int
def __repr__(self):
        return f"{self.prenom} {self.nom}"

Thibault houdon

Mentor

Ça sert si tu n'utilises pas de dataclass (ce qui arrive très souvent) ou si tu souhaites modifier ce que retourne l'implémentation par défaut des dataclass :)

merci pour ces éclairages

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.