你如何在python中设置__contains__方法?

时间:2013-02-08 06:14:29

标签: python class methods contains

我无法理解如何在班级中正确设置包含方法。我知道当你调用它时它会自动使用“in”运算符,我只是觉得我不明白如何正确设置它。

我必须使用它来查看anotherCircle是否包含在特定的圆圈内(来自用户的输入)。教授让我们为此做了两种不同的方法。

第一个我没有遇到任何问题,或多或少地了解它在做什么,具体如下:

def contains(self, circle2d):
  dist = math.sqrt((circle2d._x - self._x)**2 + (circle2d._y - self._y)**2) #Distance of second circle's coords from the first circle's coords
  if dist + circle2d._radius <= self._radius:
     return True

但是,下一个应该做同样事情的方法使用 contains 方法,以便我们可以在main函数中使用 in 来调用它。我只有这个:

def __contains__(self, anotherCircle):
    if anotherCircle in self:
        return True 

我尝试运行此错误时遇到多个错误。我想我错过了自己的一些东西,但我不确定是什么?有人可以试着向我解释当你写一个包含方法时你需要做什么?

2 个答案:

答案 0 :(得分:9)

对象上的__contains__方法不会调用 in;相反,它是in运算符调用的内容。

写作时

if circle1 in circle2:

python解释器将看到circle2是一个Circle对象,并将查找为其定义的__contains__方法。它基本上会尝试调用

circle2.__contains__(circle1)

这意味着您需要在不使用__contains__的情况下编写in方法,否则您将编写永不结束的递归方法。

答案 1 :(得分:1)

您的__contains__方法必须使用与原始contains方法相同的逻辑。否则,Python将如何知道一个圆圈包含另一个圆圈意味着什么?你必须告诉它,这就是__contains__方法的用途。您可以__contains__致电contains,或者只是将整个代码放入该方法中。