我在回答过去的一个纸上问题,这是我对类定义的回答。 我的代码:
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参数来允许类访问变量?或者是否有其他问题导致位置参数错误?你知道吗
评分方案中的“答案”是错误的。它坏了。它不起作用。换句话说,您的代码是正确的。你应该使用你的代码,而不是标记方案。在我看来,似乎是一个没有实际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
参数,SetGrade
和SetFinalMark
和GetFinalMark
的实现将Grade
和FinalMark
视为全局变量,因此如果您没有首先遇到所有这些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个阈值的等级),那么您将得到:
不过,我完全承认,这是A级论文无法企及的。:-)根据评分方案,你甚至得不到你的分数,除非阅卷人实际上,他对Python编程有足够的了解,能够理解上述内容偏离方案的原因。你知道吗
相关问题 更多 >
编程相关推荐