Есть ли способ остановить выполнение метода __init__? - PullRequest
0 голосов
/ 18 января 2019

У меня есть класс Point. Его метод __init__ проверяет, есть ли точка на холсте черепахи. Если он обнаружит, что он уже есть, мне нужно предотвратить дальнейшее выполнение init.

points = []
class Point():
    def __init__(self, pen, points=points):
        self.x = pen.xcor()
        self.y = pen.ycor()
        for point in points:
            if point == (self.x, self.y, pen):
            # here, I need to stop __init__ from executing
            return True# this raises an error, but does not stop
            #the function the way I want
        points.append((self.x, self.y, pen))
        self.pen = pen
        self.get()

point1 = Point(p)

Вот что я получаю:

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    point1 = Point(p)
TypeError: __init__() should return None, not 'bool'

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Как говорится в сообщении об ошибке, __init__() должно возвращать None, а не 'bool'. Измените return True на return (что эквивалентно return None).

for point in points:
    if point == (self.x, self.y, pen):
        return

Его метод __init__ проверяет, есть ли точка на холсте черепахи. Если он обнаружит, что он уже есть, мне нужно предотвратить дальнейшее выполнение init.

Тем не менее, трудности, с которыми вы сталкиваетесь, свидетельствуют о недостатке дизайна. Точка не должна проверять внешний список точек и отказываться от построения; скорее код, который создает точку, должен выполнить проверку.

Я бы вытащил цикл из конструктора и сделал бы проверку вызывающим.

0 голосов
/ 18 января 2019

Может быть, вы можете использовать что-то вроде этого?

class Point():
    def __init__(self, pen, points=points):
        self.x = pen.xcor()
        self.y = pen.ycor()
        for point in points:
            if point == (self.x, self.y, pen):
                return
        points.append((self.x, self.y, pen))
        self.pen = pen
        self.get()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...