2016-04-06 2 views
-1

Я пытаюсь определить класс Student с именем, идентификационным номером, результатами тестов и средними показателями тестов. Когда я запускаю программу, все работает, за исключением того, что печатает среднюю оценку теста после того, как новые оценки добавлены в исходный список баллов в классе. Он сохраняет исходное среднее значение «Undefined», и я не могу понять, почему он не обновляется.Определение методов класса в 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 

Защиту основной():

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) 

основной()

ответ

0

Одна вещь, которая поражает меня как-то, что необходимо решить, что вы не вызывая методы класса в финале петля.

попробовать

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

Остальные методы не нужны, как (я предполагаю), вы только хотите напечатать значения, а не хранить в переменных.

1

Вот более Pythonic определение класса:

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) 

Используя @property декоратора, self.average свойство, которое будет рассчитывать на себя. Это помогает избежать вопроса о том, «обновлен ли self.average?», Так как все вычисления выполняются самим атрибутом. Кроме того, таким образом вы можете использовать nan (not-a-number), если нет баллов.

Смежные вопросы