用于随机测验问题的Python元类

时间:2016-09-11 05:26:29

标签: python metaclass

对于大型数学课程的教学,编写一些内置随机化的问题是有帮助的,因此并非所有学生都能得到完全相同的问题。我的解决方案是编写一个简短的Python脚本来生成一些问题 - 除了数字的微小变化外,它们是相同的。结果可能是给出测验的A / B / C / D类,并自动给我解决方案集A / B / C / D进行快速评分。

我想稍微规范一下,允许其他人使用基本的 Python技能来创建随机测验。另外,更好地组织我自己的工作。我的第一个想法是创建一个带有Question类的模块,该类具有初始化方法,用于渲染(生成LaTeX代码以包含在测验文档中),用于评估给定的响应/答案以及各种其他属性。

但是,问题类的不同实例(不同的随机问题)会有不同的方法。例如,一个问题可能会随机生成两个三位数字x,y,并将问题呈现为“查找(x,y)的GCD”。初始化时,问题也会计算答案,并在评估方法中引用它。另一个问题可能会随机生成一个三位数的数字p,并将问题呈现为“Is p prime?”。

我想到了一些解决方案:

  1. 将代码放入字符串属性中,并通过exec / eval调用它。这很糟糕。

  2. 每次写一个新问题时都会覆盖各种方法。当我对此进行调查时,我学会了“猴子修补”一词,这似乎也很糟糕。

  3. 使用问题元类!然后,我猜每个随机化的问题最终都会成为一个班级。

  4. 我猜解决方案3是正确的,所以我必须学习元类。但是,这将是一个有点伤心过。我真的希望初学者程序员可以使用它来编写随机问题。我不希望初学者必须为每个问题申报一个班级。

    其他想法?当谈到面向对象的编程方面时,我自己的技能是初学者。

    编辑:或许更多信息会有所帮助。

    我希望以后能够轻松引用问题,例如用于制作考试或解决方案表。例如,我想将一个问题列表传递给一个函数,使用单个命令,如“make_exam([q1,q2,q3],randomize = True)”,其中q1,q2,q3是三个问题。该命令将返回用于q1,q2,q3的问题文本的考试的LaTeX代码,适当地随机化每一个。我也可以打开/关闭解决方案表等。为此,我认为我需要问题对象来提供各种方法。

1 个答案:

答案 0 :(得分:0)

会有很多问题,每个问题中的一些参数会随机化。我假设没有选择问题的随机化,只有他们的参数(虽然这将以相同的方式解决)。

所以,你可以为每个问题设一个课程:

class QuestionTemplate1():
    def __init__(self):
        self.x = random.randint(100, 1000)
        self.y = random.randint(100, 1000)

    def get_question(self):
        return "Find the GCD of (%d, %d)" % (self.x, self.y)

要创建问题的变体,只需创建一个实例。它们将是随机的,它们将是不同的:

quesition1_a = QuestionTemplate1()
quesition1_b = QuestionTemplate1()

您将拥有所有问题模板[QuestionTemplate1, QuestionTemplate2, QuestionTemplate3,...]的列表,并为每个模板创建4个问题。

唯一剩下的就是可重复性。你以后可以不能重复相同的随机值吗?是。

在脚本开头设置种子。

random.seed(3543626)

questions_a = [Q() for Q in all_templates]
questions_b = [Q() for Q in all_templates]
questions_c = [Q() for Q in all_templates]
questions_d = [Q() for Q in all_templates]

如果使用相同的种子再次运行相同的代码,您将获得相同的随机参数。我可能会在开头随机化种子并用问题打印出来。然后,如果我愿意的话,我可以重新创建相同的问题。

就是这样。没有eval,没有exec,没有monkeypatching,没有元类。甚至不是超级班。