我已经阅读了许多有关Python为什么没有真正私有变量的SO线程,对于大多数应用程序,我都能理解。
这是我的问题:我正在创建一个班级项目。在这个班级项目中,学生设计一个代理来参加选择题测试。我们希望能够立即评分以便代理可以从之前的错误答案中学习。因此,我们需要将每个问题的正确答案存储在程序中。学生在本地机器上运行这些项目,因此他们可以看到所有测试者的代码。他们无法修改它--当他们提交时,我们会覆盖他们对测试者代码所做的任何更改。他们只需提交代表其代理的新文件。
在Java中,这很简单。在Problem类中,有一个private的correctAnswer变量。correctAnswer始终存储问题的正确答案。代理只能通过checkAnswer方法读取correctAnswer,并且为了调用checkAnswer,代理必须实际给出不能在之后更改的问题答案。
我需要在Python中重新创建这种行为,到目前为止我束手无策。似乎无论在程序的哪个位置存储correctAnswer,代理都可以访问它--我熟悉下划线约定,但在这个问题中,我需要代理无法访问正确答案。我唯一能想到的是在测试学生代码时将correctAnswer命名为不同的名称,以便他们的代理无法预测它将被称为什么,但这是一个不优雅的解决方案。
有什么建议吗?只要我们可以检测到代理何时读取它(以便我们可以在那之后将'代理答案'变量设置为只读...尽管然后我也需要一种方法来做到这一点,oof),代理就可以阅读correctAnswer。
这是我的问题:我正在创建一个班级项目。在这个班级项目中,学生设计一个代理来参加选择题测试。我们希望能够立即评分以便代理可以从之前的错误答案中学习。因此,我们需要将每个问题的正确答案存储在程序中。学生在本地机器上运行这些项目,因此他们可以看到所有测试者的代码。他们无法修改它--当他们提交时,我们会覆盖他们对测试者代码所做的任何更改。他们只需提交代表其代理的新文件。
在Java中,这很简单。在Problem类中,有一个private的correctAnswer变量。correctAnswer始终存储问题的正确答案。代理只能通过checkAnswer方法读取correctAnswer,并且为了调用checkAnswer,代理必须实际给出不能在之后更改的问题答案。
我需要在Python中重新创建这种行为,到目前为止我束手无策。似乎无论在程序的哪个位置存储correctAnswer,代理都可以访问它--我熟悉下划线约定,但在这个问题中,我需要代理无法访问正确答案。我唯一能想到的是在测试学生代码时将correctAnswer命名为不同的名称,以便他们的代理无法预测它将被称为什么,但这是一个不优雅的解决方案。
有什么建议吗?只要我们可以检测到代理何时读取它(以便我们可以在那之后将'代理答案'变量设置为只读...尽管然后我也需要一种方法来做到这一点,oof),代理就可以阅读correctAnswer。
correctAnswer
变量来防止作弊吗?那么只看他们提交的代码不就可以确定吗? - danoprivate
来防止访问,那么你将容易受到反射字段访问的攻击,例如Problem.class.getDeclaredField("correctAnswer").get(problem)
。 - user2357112