Запутанная предыдущая статья, почему в ней не указаны параметры? - PullRequest
1 голос
/ 06 ноября 2019

Я отвечал на прошлый бумажный вопрос, и это был мой ответ для определения класса. Мой код:

class ExaminationPaper:
    def __init__(self,Centre_number,Candidate_number):
        y = str(Centre_number) + str(Candidate_number)
        self.PaperID = y
        self.Grade = "Fail"
        self.FinalMark = 0

    def SetGrade(self,Dist,Merit,Pass):
        if self.FinalMark >= Dist:
            self.Grade = "Distinction"
        elif self.FinalMark >= Merit:
            self.Grade = "Merit"
        elif self.FinalMark >= Pass:
            self.Grade = "Pass"
        else:
            self.Grade = "Failure :("
    def SetFinalMark(self,Mark):
        if Mark >= 0 and Mark <= 90:
            self.FinalMark = Mark
            return(True)
        else:
            return(False)
    def GetFinalMark(self):
        return(self.FinalMark)
Chomba = ExaminationPaper(559,9022)
Chomba.SetFinalMark(80)

Это ответ, который мне предоставила схема меток:

class ExaminationPaper:
    def __init__(self,Centre_number,Candidate_number):
        y = str(Centre_number) + str(Candidate_number)
        self.PaperID = y
        self.Grade = "Fail"
        self.FinalMark = 0

    def SetGrade(Dist,Merit,Pass):
        if FinalMark >= Dist:
            Grade = "Distinction"
        elif FinalMark >= Merit:
            Grade = "Merit"
        elif FinalMark >= Pass:
            Grade = "Pass"
        else:
            Grade = "Failure :("
    def SetFinalMark(Mark):
        if Mark >= 0 and Mark <= 90:
            FinalMark = Mark
            return(True)
        else:
            return(False)
    def GetFinalMark():
        return(FinalMark)
Chomba = ExaminationPaper(559,9022)
Chomba.SetFinalMark(80)

Когда я опробовал код схемы меток, он выдал ошибку для каждого изметоды в классе, утверждающие, что число используемых позиционных аргументов было больше, чем методы, принимаемые для каждого, после того, как я закомментировал их один за другим.

Кажется, что работает с моим кодом, но схема меток определенно утверждает, чтов методе GetFinalMark не должно быть, например, параметра.

На экзамене я бы лучше использовал свой собственный код или предпочел бы работать так, как говорится в схеме меток, и игнорировать использованиепараметр self, чтобы разрешить классу доступ к переменным? или есть другая проблема, вызывающая ошибку позиционного аргумента?

1 Ответ

4 голосов
/ 07 ноября 2019

«Ответ» в схеме маркировки неверен . Это сломано. Не работаетДругими словами, ваш код правильный . Вы должны использовать свой код, а не схему пометки. Для меня это выглядит так, как будто кто-то без реального опыта программирования на 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, чтобы понять, почему вышесказанное отклоняется от схемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...