Как вызвать метод на объекте, при создании его в python? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть вопрос, но я не знаю точно, как его объяснить, поэтому позвольте мне добавить сюда код:

class 2DVector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def multiply(self, scalar):
        self.x *= scalar
        self.y *= scalar

возможно ли сделать что-то подобное

vector1 = 2DVector(1, 1).multiply(3)
# x == 3, y == 3

или я всегда должен делать это так

vector2 = 2DVector(1, 1)
# x == 1, y == 1
vector2.multiply(3)
# x == 3, y == 3

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Добавление return self в конце метода multiply позволяет использовать первый параметр:

class TwoDVector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def multiply(self, scalar):
        self.x *= scalar
        self.y *= scalar
        return self


if __name__ == '__main__':
    vector = TwoDVector(2, 3).multiply(2)
    # vector.x == 4, vector.y == 6
0 голосов
/ 13 сентября 2018

Если вы хотите использовать vector2.multiply (3) напрямую, вам нужно адаптировать свой метод и вернуть что-то.

    def multiply(self, scalar):
        self.x *= scalar
        self.y *= scalar
        return self

Но мне не нравится это решение и я предпочитаю:

    def multiply(self, scalar):
        return 2DVector(self.x * scalar, self.y * scalar)

и обрабатывать вектор как неизменяемые объекты.

Или сохраните свою первую реализацию и выполните

vector2 = 2DVector(1, 1)
# x == 1, y == 1
vector2.multiply(3)
# x == 3, y == 3
0 голосов
/ 13 сентября 2018

Они эквивалентны в том, что они оба масштабируют вектор.

Но ваш первый пример не очень полезен, он не хранит ссылку на экземпляр класса.Вместо этого он сохраняет ссылку на возвращаемое значение multiply (равное None), поэтому ваша векторная ссылка теряется.

Как уже упоминалось, вы можете изменить multiply для возврата self.

Вы также можете добавить масштабный коэффициент в конструктор:

class 2DVector:
    def __init__(self, x, y, scale=1):
        self.x = x
        self.y = y
        self.multiply(scale)

# scales vector to (3, 3)
vector1 = 2DVector(1, 1, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...