«Ответ» в схеме маркировки неверен . Это сломано. Не работаетДругими словами, ваш код правильный . Вы должны использовать свой код, а не схему пометки. Для меня это выглядит так, как будто кто-то без реального опыта программирования на Python написал это и не проверял, действительно ли он будет работать. Я не ожидал бы, что будущие экзамены будут делать такие вопиющие ошибки, и если бы они это сделали, у вас было бы много оснований для оспаривания результатов.
Для функций, определенных в классе, когда вы используете имя функции в качестве атрибута дляэкземпляр и вызов его, Python автоматически передаст функции в качестве первого позиционного аргумента . Мы используем только имя self
для этого аргумента в соответствии с соглашением.
Так, например, для метода SetFinalMark()
произойдет то, что Python передает в качестве первого аргумента экземпляр, и поэтому он назначенна имя Mark
. Вы можете назвать его как Chomba.SetFinalMark()
, после чего Mark
будет установлен на ссылку на экземпляр, который вы назвали Chomba
. Затем метод вызовет другое исключение, поскольку класс ExamResult()
не поддерживает сравнения, поэтому Mark >= 0
вызовет исключение TypeError
(TypeError: '>=' not supported between instances of 'ExaminationPaper' and 'int'
).
И это также означает, что *Метод 1023 * будет всегда терпеть неудачу, потому что он не принимает никаких параметров (TypeError: GetFinalMark() takes 0 positional arguments but 1 was given
).
Существуют другие проблемы с кодом схемы маркировки. Поскольку нет параметра self
, реализация SetGrade
и SetFinalMark
и GetFinalMark
вместо этого обрабатывает Grade
и FinalMark
как глобальные переменные, и поэтому вызовет исключения NameError
, если вы не сделали это сначаластолкнуться со всеми этими TypeError
исключениями. А в Python оператор return
является , а не функцией . Хотя return(<expression)
работает , это, безусловно, приведет в замешательство начинающих программистов и не поможет при различении выражений и операторов . Скобки (..)
действительно являются частью выражения и будут избыточными, если после return
будет пробел;вы действительно должны использовать return <expression>
без скобок.
Наконец, и это проблема с назначением , а не только со схемой отметок, весь пример идет против Python соглашения о присвоении имен по стилю , которые помогут легко определить классы по сравнению с другими именами. В идеале, только ExaminationPaper
должен использовать именование CamelCase, все остальное должно использовать snake_case (слова в нижнем регистре, объединенные подчеркиванием), включая все имена атрибутов, параметры и имена методов.
Я осмотрелся иэто похоже на прошлую статью по компьютерным наукам уровня Великобритании, май / июнь 2019 года (# 4) (доступно на нескольких сайтах, , это схема оценки на одном таком сайте , с этимпрошлая статья ). Если так, то похоже, что авторы перепутали свои условности. Статья позволяет студенту выбирать между Python, Pascal и Visual Basic, и их код выглядит так, как будто автор применил принципы Visual Basic к коду Python. В Visual Basic параметр self
отсутствует. Выбор разрешения для нескольких языков реализации также ограничил пространство для применения обычных соглашений по именованию Python.
Но если соглашения Python не применяются, я также отмечу, что они также используют имена атрибутов. как __FinalMark
в схеме разметки, показывая отсутствие понимания того, как Python обрабатывает инкапсуляцию. Я не буду здесь вдаваться в подробности, но я написал ответ, который объясняет, почему использование двойных подчеркиваний здесь неправильно . То, что они тогда полностью не смогли использовать правильные имена атрибутов, делает их версию «правильной» реализации для трех методов, которую вас попросили написать, еще более неправильной.
Если вы хотите реализовать все «правильно» в соответствии собычные соглашения и руководство по стилю Python (включая использование свойств и лучшего названия для того, как обрабатывается оценка на основе 3 порогов), вы получите:
class ExaminationPaper:
def __init__(self, centre_number, candidate_number):
self.paper_id = f"{centre_number}{candidate_number}"
self.grade = "Fail"
self._final_mark = 0
def determine_grade(self, dist_mark, merit_mark, pass_mark):
if self._final_mark >= dist_mark:
self.grade = "Distinction"
elif self._final_mark >= merit_mark:
self.grade = "Merit"
elif self._final_mark >= pass_mark:
self.grade = "Pass"
else:
self.grade = "Fail"
@property
def final_mark(self):
return self._final_mark
@final_mark.setter
def final_mark(self, mark):
if not (0 <= mark <= 90):
raise ValueError(f"Final mark {mark} not in range 0-90")
self._final_mark = mark
chomba = ExaminationPaper(559, 9022)
try:
chomba.final_mark = 80
except ValueError as e:
print("Could not set the final mark:", e)
else:
chomba.determine_grade(80, 70, 55)
print(f"For {chomba.paper_id}, the student was given a {chomba.grade}")
Я полностью признаю, что это совсем недосягаемо для бумаги уровня А, однако. :-) И учитывая схему отметок, вы даже не получите свои отметки, если человек, отмечающий статью, на самом деле не знает достаточно о программировании на Python, чтобы понять, почему вышесказанное отклоняется от схемы.