2016-04-06 4 views
-1

Ich versuche, eine Klasse namens Student mit einem Namen, einer ID-Nummer, Testergebnissen und dem Durchschnitt der Testergebnisse zu definieren. Wenn ich das Programm ausführe, funktioniert alles außer dem Drucken des Testergebnisdurchschnitts, nachdem neue Ergebnisse an die ursprüngliche Bewertungsliste in der Klasse angehängt wurden. Es behält den ursprünglichen Durchschnitt von "Undefined" bei und ich kann nicht herausfinden, warum es nicht aktualisiert wird.Definieren von Klassenmethoden in Python 3.43

class Student: 

"""The Student class stores the first and last name of a student, 
    as well as all of their exam scores and overall average.""" 

def __init__(self, Id, first='', last=''): 
    """Create a student object (e.g., Student(123654, Jane, Doe))""" 
    self.Id = Id 
    self.first_name = first 
    self.last_name = last 
    self.scores = [] 
    self.average = 'Undefined' 

def getId(self): 
    """Retrieves student's Id number""" 
    return self.Id 

def getfirst(self): 
    """Retrieves student's first name""" 
    return self.first_name 

def getlast(self): 
    """Retrieves student's last name""" 
    return self.last_name 

def getscore(self): 
    """Retrieves list of student's test scores""" 
    return self.scores 

def getaverage(self): 
    """Retrieves student's average test score""" 
    return self.average 

def add_score(self, score): 
    """Updates student's list of test scores""" 
    self.scores.append(score) 
    return self.scores 

def calculate_average(self): 
    """Updates student's average test score using updated list of scores""" 
    self.average = sum(self.scores)/len(self.scores) 
    return self.average 

def __str__(self): 
    """Organizes student's information into a printable statement""" 
    return "ID: " + self.Id + " Name: " + self.first_name + " " + \ 
        self.last_name + " Average Score: " + self.average 

def main():

print('This program reads student data from a file, prompts the') 
print('user for the total number of exams completed, and outputs ') 
print('the average score for each student.') 


infile = open("student_data.txt", "r") 
student_list = [] 

num_exams = int (input('Enter the number of exams completed: ')) 

for line in infile: 
    Id, first, last = line.split() 
    student = Student(Id, first, last) 
    print('Enter scores for student', Id) 
    for i in range(num_exams): 
     score = int (input('Enter an exam score: ')) 
     student.add_score(score) 
    student_list.append(student) 

infile.close() 

for student in student_list: 
    student.getscore 
    student.calculate_average 
    student.getaverage 
    print(student) 

main()

Antwort

0

Eine Sache, die mich als etwas auffällt, das, dass Sie nicht die Klassenmethoden in der letzten Aufruf behandelt werden muss ist Schleife.

versuchen

for student in student_list: 
    student.calculate_average() 
    print(student) 

Der Rest der Methoden sind nicht notwendig, da (ich nehme an) Sie wollen nur die Werte drucken, und es nicht in Variablen zu speichern.

1

Hier eine Pythonic Klassendefinition ist:

from math import nan 
from statistics import mean, StatisticsError 

class Student(object): 
    """The Student class stores the first and last name of a student,                                  
    as well as all of their exam scores and overall average.""" 

    def __init__(self, Id, first='', last=''): 
     """Create a student object (e.g., Student(123654, Jane, Doe))""" 
     self.Id = Id 
     self.first = first 
     self.last = last 
     self.scores = [] 

    def __repr__(self): 
     """Organizes student's information into a printable statement""" 
     return "{0.__class__.__name__}({0.Id}, '{0.first}', '{0.last}', {0.average})".format(self) 

    def __str__(self): 
     """Organizes student's information into a printable statement""" 
     return "{0.__class__.__name__}({0.Id}, '{0.first}', '{0.last}', {0.average})".format(self) 

    @property 
    def average(self): 
     try: 
      return mean(self.scores) 
     except StatisticsError: 
      return nan 

    def add_score(self, score): 
     """Updates student's list of test scores""" 
     self.scores.append(score) 

Durch die @property Dekorateur verwendet wird, ist self.average eine Eigenschaft, die sich berechnen wird. Dies hilft, die Frage zu vermeiden, ob "self.average schon aktualisiert wurde?", Da die gesamte Berechnung durch das Attribut selbst erfolgt. Auf diese Weise können Sie nan (keine Nummer) verwenden, wenn keine Punktzahl vorhanden ist.

Verwandte Themen