0
votes

Difficulté à comprendre les cours en python

Je suis débutant en python et j'ai du mal à comprendre les cours. J'ai une tâche qui me demande de créer une classe qui devrait renvoyer une information aux étudiants par ex. Nom, identifiant, âge et marques. J'ai fait une classe mais j'ai des problèmes avec la sortie et continuez à obtenir une erreur d'attribut:

import random

class Student:
    def __init__(self, name, ID):
        self.name = name
        self.ID = ID

    def setAge(self, age):
        self.age = age
        self.age = random.randint(0, 100)

    def setMarks(self, marks):
        self.marks = marks
        self.marks = random.randint(0, 100)

    def Display(self):
        print("Student: " + self.name + " ID: " + self.ID + " Age: " + self.age + " Mark: " + self.mark)

student = Student("John", "ID123")
student.Display()


5 commentaires

Vous n'avez pas réglé d'âge ni de marques avant d'afficher l'info ...


Oui, parce que vous ne définissez jamais un âge pour votre élève.


Merci je viens de voir la question aussi merci pour les réponses rapides!


Dans Settage () , quel est le point de self.age = Âge , étant donné que vous réaffectez immédiatement self.action à un aléatoire Nombre quand même?


Ajouter self.action = Aucune et Self.Mark = Aucune à la fonction __ init __ fonction.


5 Réponses :


0
votes

L'attribut Âge code> n'est pas défini car il n'a jamais été attribué:

student = Student("John", "ID123")
student.setAge(30) # John is 30 years old.
student.Display()


1 commentaires

Et bien que cela résout le problème, et cela convient certainement à cette mission, je tiens à ajouter que c'est un design quelque peu médiocre: si chaque élève a un âge, cela devrait être un argument requis dans le constructeur.



1
votes

Vous n'avez pas appelé étudiant.setmarks () et étudiant.setage () , donc marque et Âge Les attributs ne sont pas encore créés dans l'objet.

La solution consiste à appeler ces deux méthodes avant d'appeler étudiant.display ()


1 commentaires

Merci pour la réponse rapide qui a fonctionné parfaitement pour moi



1
votes

Dans votre exemple, vous essayez d'accéder à la variable avant la mission. Vous devrez réellement appeler étudiant.setage code> et étudiant.setmarks code> avec des arguments.

sur l'autre note, dans votre réglage de la fonction, vous écrasez instantanément la valeur. Supprimer la première ou la deuxième affectation: P>

def setAge(self, age):
    self.age = age # first assignment
    self.age = random.randint(0, 100) # second assignment


0 commentaires

0
votes

def __init __ () fonctionne comme un constructeur. Essayez d'inclure l'attribut ÂGE à l'intérieur du __ init __ () Fonction, appelez Sétage () à partir de __ init __ () , ou Settage () explicitement avant d'appeler Affichage () .

bonne chance :)


0 commentaires

1
votes

Les objets Python sont un conteneur qui a des attributs que vous pouvez définir. Si vous ne définissez pas d'attribut, essayez de le lire, vous obtenez un attributeError , ce qui signifie que l'attribut que vous recherchez n'existe pas.

actuellement, étudiant = étudiant ( ...) Appels Étudiant .__ init __ , qui attribue le nom et id attribut de l'objet. Vous n'appelez jamais étudiant.setage ou étudiant.setmarks , donc votre objet Âge et marques ne sont jamais définis et On ne peut pas accéder.

Il est traditionnel d'affecter des valeurs par défaut dans la méthode __ init __ si vous souhaitez éviter généralement des accidents inattendus comme ça.

Autre chose Est-ce plutôt que les méthodes de getter et de réglage, comme le feraient, par exemple, Python encourage l'utilisation des propriétés. Les propriétés sont des objets dans le modèle de classe qui peut être accessible comme un attribut normal, mais vous permettent d'exécuter un code arbitraire à la place des opérateurs d'accès et d'affectation.

Mettre tout ce qui est ensemble, vous pouvez écrire quelque chose comme < / p> xxx


0 commentaires