Мне нужно выяснить способ принятия кода, который уже был задан, и улучшения его, сделав его классом, объектно-ориентированным.Взятие класса и создание нового класса, объектно-ориентированного (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'
ah, поэтому сначала создайте список, а затем используйте int и float, основываясь на позиции список? –
@HK: Да, '.split() 'возвращает список; то вы можете получить доступ к отдельным элементам и применять конверсии по мере необходимости. –
также, в def loadRecords (self, reader) StudentReport, я получил ошибку, заявив, что имя глобального имени не определено? –