2013-09-26 2 views
0

Мне нужно выяснить способ принятия кода, который уже был задан, и улучшения его, сделав его классом, объектно-ориентированным.Взятие класса и создание нового класса, объектно-ориентированного (python)

Этот код: уже был указан, и мы используем его для нашего нового кода. файл «students2txt» извлекается по строкам (разделяется на «:»), а класс StudentFileReader импортируется в новый class StudentReport(object). И поэтому готовый проект должен предоставить список учеников с идентификационными номерами, именами и фамилиями, gpa (вся информация предоставляется в «students2.txt». Мне просто нужно сделать код распечатать всю информацию.

filereader.py:

class StudentFileReader: 
    def __init__(self, inputSrc): 
     self._inputSrc = inputSrc 
     self._inputFile = None 

    def open(self): 
     self._inputFile = open(self._inputSrc, 'r') 

    def close(self): 
     self._inputFile.close() 
     self._inputFile = None 

    def fetchRecord(self): 
     line = self._inputFile.readline() 
     if line == "": 
      return None 

     record = StudentRecord() 

    #change 
     record.idNum = int(line) 
     record.firstName = self._inputFile.readline().rstrip().rsplit(':') 
     record.lastName = self._inputFile.readline().rstrip().rsplit(':') 
     record.classCode = int(self._inputFile.readline()) 
     record.gpa = float(self._inputFile.readline()) 

     return record 

class StudentRecord: 
    def __init__(self): 
     self.idNum = 0 
     self.firstName = "" 
     self.lastName = "" 
     self.classCode = 0 
     self.gpa = 0.0 

Новый файл:..

from filereader import StudentFileReader 


class StudentReport(object): 
    def __init__(self): 
     self._theList = None 
    def loadRecords(self, filename): 
     self.reader = StudentFileReader(filename) 
     self.reader.open() 

     theList = [] 
     record = self.reader.fetchRecord() 
     while record is not None: 
      theList.append(record) 
      record = self.reader.fetchRecord() 

     reader.close() 
     return theList 

    def sortByid(self): 
     self._studentList.sort(key = lambda rec: rec.idNum) 

    def sortByName(self): 
     pass 

    def __str__(self): 
     classNames = [ "", "Freshman", "Sophomore", "Junior", "Senior" ] 




     print("LIST OF STUDENTS".center(50)) 
     print("") 
     print("%-5s %-25s %-10s %-4s" % ('ID', 'NAME', 'CLASS', 'GPA')) 
     print("%5s %25s %10s %4s" % ('-' * 5, '-' * 25, '-' * 10, '-' * 4)) 

    # Print the body. 
     for record in theList : 
      print("%5d %-25s %-10s %4.2f" % \ 
       (record.idNum, \ 
        record.lastName + ', ' + record.firstName, 
        classNames[record.classCode], record.gpa)) 
    # Add a footer. 
     print("-" * 50) 
     print("Number of students:", len(theList)) 



if __name__ == "__main__": 
    s = StudentReport() 
    s.loadRecords('students2.txt') 
    s.sortByName() 
    print str(s) 

Этот код был взят из структур учебник данных и алгоритмов с использованием Python, я должен сделать объектно-ориентированный класс я начала StudentRecord класс и wr itten __init__, но я не совсем уверен, что делать после этого. Когда я пытаюсь запустить что-либо, это дает мне ошибку invalid literal for int() with base 10. Я новичок в Python, так что я не знаю, как сделать любой объект класса, ориентированный легко ..

редактировать: да, ошибка пришла из функции fetchRecord

Traceback (most recent call last): 
File "C:\Users\...\studentreport.py", line 24, in <module> 
    s.loadRecords('students2.txt') 
File "C:\Users\...\studentreport.py", line 13, in loadRecords 
    record = self.reader.fetchRecord() 
File "C:\Users\...\filereader.py", line 22, in fetchRecord 
    record.idNum = int(line) 
ValueError: invalid literal for int() with base 10: '10015:John:Smith:2:3.01\n' 

ответ

3

Ваш синтаксический анализатор строк не соответствует формату файла.

Вы пытаетесь интерпретировать целую строку как целое число, но строка содержит больше.

Возможно, вы хотели сначала разбить линию? Это одна строки содержит всех элементов записи:

parts = line.strip().split(':') 
record.idNum = int(parts[0]) 
record.firstName = parts[1] 
record.lastName = parts[2] 
record.classCode = parts[3] 
record.gpa = float(parts[4]) 

Вы можете переопределения оригинального StudentFileReader.fetchRecord()) метод наследования класса в собственном коде:

class MyStudentFileReader(StudentFileReader): 
    def fetchRecord(self): 
     line = self._inputFile.readline() 
     if not line: 
      return None 

     record = StudentRecord() 

     parts = line.strip().split(':') 
     record.idNum = int(parts[0]) 
     record.firstName = parts[1] 
     record.lastName = parts[2] 
     record.classCode = parts[3] 
     record.gpa = float(parts[4]) 

     return record 

Затем используют MyStudentFileReader() вместо StudentFileReader() ,

+0

ah, поэтому сначала создайте список, а затем используйте int и float, основываясь на позиции список? –

+0

@HK: Да, '.split() 'возвращает список; то вы можете получить доступ к отдельным элементам и применять конверсии по мере необходимости. –

+0

также, в def loadRecords (self, reader) StudentReport, я получил ошибку, заявив, что имя глобального имени не определено? –

1

Вы должны разделить ваши , прежде чем вы начнете пытаться преобразовать фрагменты в нужные форматы для ваших отдельных элементов данных. Прямо сейчас вы вызываете readline несколько раз, поэтому каждое из значений, которое вы вычисляете для ученика, поступает из отдельной строки из файла.

Вместо этого попробуйте расщеплению и распаковку результата непосредственно в локальные переменные:

idNum, firstName, lastName, classCode, GPA = line.rstrip().split(':') 

Тогда делать все, что преобразования каждые из этой необходимости (например, record.idNum = int(idNum)).

+0

, который, казалось, избавился от ошибки 'int'. Поэтому после этого я получил еще одну ошибку, в которой говорилось, что аргумент int() должен быть строкой или числом, а не «списком» –

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