3

我无法理解如何在我的班级中正确设置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方法,以便我们可以在主函数中调用。我只有这个:

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

尝试运行此程序时出现多个错误。我想我错过了自我,但我不确定是什么?有人可以尝试向我解释在编写这样的contains方法时到底需要做什么吗?

4

2 回答 2

9

对象上的__contains__方法不调用 in;相反,它是in运营商所称的。

当你写

if circle1 in circle2:

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

circle2.__contains__(circle1)

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

于 2013-02-08T06:23:16.577 回答
1

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

于 2013-02-08T06:34:56.047 回答