0

我必须找到一种方法来获取已经给出的代码并通过使其成为面向对象的类来改进它。

此代码:已经给出,我们将其用于我们的新代码。文件 '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)

此代码取自教科书 Data Structures and Algorithms Using Python。我应该做一个面向对象的类。我已经开始StudentRecord上课并写了,__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'
4

2 回答 2

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().

于 2013-09-26T21:17:21.793 回答
1

在开始尝试将片段转换为单个数据项所需的格式之前,您需要拆分行。现在,您正在readline重复调用,因此您为学生计算的每个值都来自文件中的单独一行。

相反,尝试将结果直接拆分并解包到局部变量中:

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

然后进行每个需要的任何转换(例如record.idNum = int(idNum))。

于 2013-09-26T21:16:05.313 回答