Exercice Student Class

Bonjour,
Je pensais avoir fait mes classes, mais non^^.
Je n’arrive pas à réaliser l’exercice. En fait, je ne comprends à quoi l’appel ci dessous correspond:

    print(paris.get_best_school().name)

name correspond à quoi? un attribut? Je connais les attributs de classe, mais j’ignore à quoi correspondrait un attribut de méthode de classe (s’il s’agit bien d’un attribut).
Merci.

Bonjour Fabien,

Dans l’expression print(paris.get_best_school().name) :

  • paris est une instance d’un objet qui a une méthode get_best_school
  • get_best_school est une méthode qui renvoie un objet (probablement un objet School vu son nom)
  • name est un attribut de l’objet renvoyé par get_best_school, donc un attribut de School.

Ça pourrait s’écrire comme ça :

school = paris.get_best_school()
print(school.name)

Bonjour mdk,
Il y a un truc qui m’échappe.
Si je fais:

class Bidon:
    def __init__(self):
        self.yop = "truc"
    def essai(self):
        pass
i = Bidon()
print(i.essai().yop)

Ceci est faux. Quel devrait être le code pour répondre à cet appel?
édit: j’ai perdu l’indentation , j’ai pourtant utilisé la balise </>… Je vais tenter de recommencer

Bonjour @fabien,

yop est un attribut de l’instance et non pas de la méthode. Il faudra faire par exemple

class Bidon:
    def __init__(self):
        self.yop = "truc"

    def essai(self):
        return self


i = Bidon()
print(i.essai().yop)
print(i.yop)

Pour mettre du code utiliser trois backticks \\\python avant et \\\ après le code

1 J'aime

merci @dancergraham.
Je rencontre toujours des soucis d’intentation, je regarderai ça un peu plus tard car je dois y aller…
… Si ma méthode essai() renvoie self, à quoi peut elle donc servir?

A pas grand chose sauf faire fonctionner ton appel print(i.essai().yop mais il faut savoir qu’une méthode peut renvoyer un autre objet, une fonction, etc etc.

C’est une désignation chaîné, c’est un peu perturbant la première fois :slight_smile:

Le wikipedia en anglais est plus complet, on parle de fluent interface:

2 J'aime

On peut citer JQuery qui utilise ce principe, ce qui a l’usage c’est bien pratique.

Tout m’est compréhensible maintenant :slightly_smiling_face:
Je ne me souviens pas d’avoir, jusqu’à présent, rencontré cette écriture. J’ai d’ailleurs rapidement parcouru la centaine de pages du tutoriel concernant les classes qui ont servi de base à mon apprentissage, et sauf erreur de ma part, je n’ai rien vu qui évoquait cette écriture …
Merci à vous tous :kissing_smiling_eyes:

1 J'aime

c’est pas ça qu’on appelle le «duck typing»?

Non le “duck typing” se base sur l’idée que si un objet fait le bruit d’un canard et vol comme un canard alors on suppose que c’est un canard sans vérifier que type(obj) == Canard.

Par exemple on peut itérer sur tout objet qui implémente __getitem__ : on n’a bas besoin d’un objet de type iterable ni d’hériter d’un objet iterable .

class Bidon:
    def __init__(self):
        self.yop = "truc"

    def essai(self):
        return self

    def __getitem__(self, n):
        if n == 0:
            return self.yop
        raise StopIteration

ok merci, je pensais que le duck typing était juste le fait de «chainer» des trucs (un peu comme en JS)

Re, je bloque cette fois-ci pour réaliser la méthode get_best_student() afin de finaliser l’exercice. D’après mes essais, le reste semble correct.
Mon problème avec la méthode c’est que je travaille sur une str et non pas sur l’instance. Pouvez vous me donner une piste, histoire de soulager ma frustration?
Voici mon code (tronqué puis édité afin de ne pas mettre de solution en ligne) :

    def get_best_student(self):       
        for ecole in self.school:
            ecole.get_best_student().name.get_mean()
    # là ce n'est pas bon je travaille sur une str et non pas sur l'instance. Je tourne en rond.        
    
        return self

Je dirais que t’as besoin d’itérer sur self.student avec une variable pour garder la meilleure note trouvé et le student associé, mettre à jour la variable à chaque itération si le nouveau student est meilleur …?

-Graham

J’ai bien essayé ce que tu dis mais si je print ecole.student comme ceci:

    for ecole in self.school:
        print(ecole.student)

je ne retrouve pas ma liste mais :
[<main.Student object at 0x7fb99aadbf10>]
Je n’ai d’ailleurs pas compris pourquoi, puisque dans la méthode get_best_school, je fais la même chose avec mon attribut moyenne_school …

si c’est une liste [] avec un seul objet de type Student dedans

1 J'aime

ben oui, je ne sais pas ce que j’ai fait hier mais j’aurai du me reposer et prendre un peu distance pour mieux y revenir … Au lieu d’essayer d’autres choses, j’aurais dû chercher à éluder pourquoi le résultat ne me semblait pas conforme à ce que j’attendais.
Merci me voilà soulager d’un poids. :wink:

Bon c’est ok pour la moulinette. Je vais maintenant un peu optimiser le code, et étudier les codes des autres participants .
Il me reste par la suite encore 11 exercices . à vu d’oeil je dirais que je pourrai encore en réaliser deux ou trois. Le reste attendra que je sois plus aguéri, pour que je m’y frotte.

2 J'aime

Pour ta fonction get_best_student, je dirais que l’idéal est de passer par la fonction builtin max de Python. Tu n’aurais ainsi qu’à écrire une fonction de score, attribuant à chaque étudiant sa moyenne, à utiliser comme paramètre key de la fonction max

2 J'aime