混淆过去的文件,为什么它省略了自我参数?

2024-09-27 09:28:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我在回答过去的一个纸上问题,这是我对类定义的回答。 我的代码:

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方法中,不应该存在参数。你知道吗

在考试中,我会更好地使用自己的代码,还是更愿意按照mark方案所说的方式工作,而忽略使用self参数来允许类访问变量?或者是否有其他问题导致位置参数错误?你知道吗


Tags: 代码selfnumberreturndistdefpasscandidate
1条回答
网友
1楼 · 发布于 2024-09-27 09:28:29

评分方案中的“答案”是错误的。它坏了。它不起作用。换句话说,您的代码是正确的。你应该使用你的代码,而不是标记方案。在我看来,似乎是一个没有实际Python编程经验的人写的,并且没有验证它是否真的可以运行。我不指望将来的考试会犯这样明显的错误,如果是这样的话,你就有足够的理由对考试结果提出质疑。你知道吗

对于在类上定义的函数,当使用函数名作为实例的属性并调用它时,Python会自动将实例作为第一个位置参数传递给函数。按照惯例,我们只对该参数使用名称self。你知道吗

例如,对于SetFinalMark()方法,Python将实例作为第一个参数传入,并将其分配给名称Mark。您可以将其称为Chomba.SetFinalMark(),此时Mark被设置为引用您命名的实例Chomba。然后该方法将引发另一个异常,因为ExamResult()类不支持比较,所以Mark >= 0将引发TypeError异常(TypeError: '>=' not supported between instances of 'ExaminationPaper' and 'int')。你知道吗

这也意味着GetFinalMark()方法总是会失败,因为它不接受任何参数(TypeError: GetFinalMark() takes 0 positional arguments but 1 was given)。你知道吗

标记方案代码还有其他问题。因为没有self参数,SetGradeSetFinalMarkGetFinalMark的实现将GradeFinalMark视为全局变量,因此如果您没有首先遇到所有这些TypeError异常,则会引发NameError异常。在Python中,return语句不是函数。当return(<expression)工作时,它肯定会混淆初级程序员,并且在区分表达式语句时毫无帮助。(..)圆括号实际上是表达式的一部分,如果在return后面有空格,则是多余的;您应该真正使用不带圆括号的return <expression>。你知道吗

最后,这是赋值的一个问题,不仅仅是标记方案,整个示例都与Python style guide naming conventions相反,它有助于轻松发现类和其他名称。理想情况下,只有ExaminationPaper应该使用CamelCase命名,其他的都应该使用snake\u case(小写单词加下划线),包括所有属性名、参数和方法名。你知道吗

我四处看了看,这看起来像是2019年5月/6月英国计算机科学a-level考试的期末论文(#4)(可在多个网站上找到,this is the mark scheme one one such site,再加上this past paper)。如果是这样的话,那么作者似乎把他们的惯例弄混了。本文允许学生在Python、Pascal和visualbasic之间进行选择,他们的代码看起来就像作者将visualbasic原理应用到Python代码中一样。在visualbasic中,没有self参数。允许多种实现语言的选择也限制了应用常规Python命名约定的空间。你知道吗

但是,如果Python约定不适用,那么我还注意到它们还在标记方案中使用属性名作为__FinalMark,这表明对Python如何处理封装缺乏理解。我不想在这里详述,但我有written an answer before that explains why using double-underscore names is wrong here。然后,他们完全没有使用正确的属性名,这使得他们对于您被要求编写的三个方法的“正确”实现的版本更加错误。你知道吗

如果您想根据普通的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}")

不过,我完全承认,这是A级论文无法企及的。:-)根据评分方案,你甚至得不到你的分数,除非阅卷人实际上,他对Python编程有足够的了解,能够理解上述内容偏离方案的原因。你知道吗

相关问题 更多 >

    热门问题