Свои операторы в своей структуре питон? ч2

Опять таки, предположим есть класс v2:

class v2:
    x: int
    y: int
    def __init__(self, x=0, y=0):
        self.x = x; self.y = y

Для него я хотел создать операторы, и после немногих проб и ошибок и вопроса здесь, я пришел к такому написанию:

class v2:
    x: int
    y: int
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __add__(self, other):
        return v2(self.x + other.x, self.y + other.y)

    def __iadd__(self, other):
        self.x += other.x 
        self.y += other.y

"__add__ для вектор_1 = вектор_2 + вектор3, а __iadd__ для вектор_1 += вектор_2" Но в первом случае работает все правильно, а во-втором:

v_1 = v2()
v_2 = v2()
v_1 += v_2
print(v_1)

# Вывод: None

Где я опять ошибся?


Ответы (1 шт):

Автор решения: Мансур

Когда вы используете оператор +=, Python ожидает, что метод __iadd__ вернет обновленный объект после выполнения операции. В вашем случае, когда вы пытались использовать +=, метод __iadd__ не возвращал сам объект, из-за чего результат операции оказывался None.

Изменил ваш метод __iadd__, чтобы он работал как нужно:

class v2:
    x: int
    y: int
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __add__(self, other):
        return v2(self.x + other.x, self.y + other.y)

    def __iadd__(self, other):
        self.x += other.x 
        self.y += other.y
        return self  # Теперь метод возвращает объект после изменения

Теперь, когда вы напишете v_1 += v_2, объект v_1 будет обновлен и в тот же момент возвращен, так что print(v_1) покажет результат изменений, а не None

→ Ссылка