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 Réponses :
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()
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.
Vous n'avez pas appelé La solution consiste à appeler ces deux méthodes avant d'appeler étudiant.setmarks () code> et étudiant.setage () code>, donc marque code> et Âge code> Les attributs ne sont pas encore créés dans l'objet. P>
étudiant.display () code> p>
Merci pour la réponse rapide qui a fonctionné parfaitement pour moi
Dans votre exemple, vous essayez d'accéder à la variable avant la mission. Vous devrez réellement appeler 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> étudiant.setage code> et étudiant.setmarks code> avec des arguments. def setAge(self, age):
self.age = age # first assignment
self.age = random.randint(0, 100) # second assignment
bonne chance :) p> def __init __ () code> fonctionne comme un constructeur. Essayez d'inclure l'attribut ÂGE code> à l'intérieur du __ init __ () Code> Fonction, appelez Sétage () code> à partir de __ init __ () code>, ou Settage () Code> explicitement avant d'appeler Affichage () Code>. P>
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 actuellement, Il est traditionnel d'affecter des valeurs par défaut dans la méthode 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. P> Mettre tout ce qui est ensemble, vous pouvez écrire quelque chose comme < / p> attributeError code>, ce qui signifie que l'attribut que vous recherchez n'existe pas. étudiant = étudiant ( ...) CODE> Appels Étudiant .__ init __ code>, qui attribue le nom code> et id code> attribut de l'objet. Vous n'appelez jamais étudiant.setage code> ou étudiant.setmarks code>, donc votre objet Âge code> et marques code> ne sont jamais définis et On ne peut pas accéder. p> __ init __ code> si vous souhaitez éviter généralement des accidents inattendus comme ça. P>
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 () CODE>, quel est le point deself.age = Âge code>, étant donné que vous réaffectez immédiatementself.action code> à un aléatoire Nombre quand même?Ajouter
self.action = Aucune code> etSelf.Mark = Aucune code> à la fonction__ init __ code> fonction.