Вектор умножения питона - PullRequest
0 голосов
/ 15 марта 2019

Здравствуйте, я изучаю Python, и я получаю тему класса. Я получил сообщение об ошибке, подобное этому:

"TypeError: __init__() missing 1 required positional argument: 'y'"

это мой код из оболочки:

class Vektor():
    """ Bu bir vektör sınıfıdır"""
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def boyu(self):
        boy = (self.x**2+self.y**2)**0.5
        return boy
    def __repr__(self):
        return ("%di + %dy" %(self.x, self.y))
    def __sub__(self,digeri):
        return Vektor(self.x - digeri.x, self.y - digeri.y)
    def __add__(self,digeri):
        return Vektor(self.x + digeri.x, self.y + digeri.y)
    def __eq__(self,digeri):
        if self.boyu() == digeri.boyu(): return True
    def __mul__(self,digeri):
        self.x = Vektor(self.x + digeri.x)
        self.y = Vektor(self.y + digeri.y)
        return Vektor(self.x*digeri.x,self.y*digeri.y)

Когда я пытаюсь создать C = A * B, я получаю сообщение об ошибке:

TypeError: init () отсутствует 1 обязательный позиционный аргумент: 'y'

Я уже благодарю вас и хочу напомнить, что я новичок в программировании :))

Ответы [ 3 ]

2 голосов
/ 15 марта 2019

Сколько аргументов требуется Vektor.__init__?Игнорируя self, это два - x и y.

Когда вы написали return Vektor(self.x*digeri.x,self.y*digeri.y), вы передали два аргумента, так что это работает.

Когда вы написали self.x = Vektor(self.x + digeri.x), это не работает, потому что вы не передаете второй аргумент для значения y.

Когда Python сообщал вам об ошибке, он должен был включать номер строки, которая должна указывать, гдепроизошла ошибкаВы не включили это, но это была эта строка, не так ли?

Поскольку Vektor должен содержать два скаляра и иногда не заменять их двумя векторами, вы можете просто написать

    self.x = self.x + digeri.x # still not a vector
    self.y = self.y + digeri.y # also not a vector

но более важный урок - . Внимательно прочитайте сообщение об ошибке .Все, что вам было нужно, было там.


Замечание о семантике операторов: поскольку обычно вы не ожидаете, что выражение, такое как x = v * w, изменит x, вы не должны мутировать self внутриоператорская функция в любом случае.

Вы возвращаете результирующий вектор, чего достаточно.Я показал вам, как исправить синтаксис этих двух строк, но на самом деле вы должны просто полностью удалить их.

И еще одно замечание о векторах: перегрузка * не так очевиднавыиграть, как это для скалярного числового типа, потому что векторы обычно имеют более одного возможного типа продукта.

1 голос
/ 15 марта 2019

В __mul__ вы по какой-то причине делаете:

self.x = Vektor(self.x + digeri.x)

, который вызывает Vektor.__init__, предоставляя только позиционный аргумент x, со значением self.x + digeri.x, но ничего для yТаким образом, ошибка.Также это пытается изменить атрибут x на объект из Vektor самого себя, я не могу себе представить, что это как-то то, что вы хотите.

Для меня не ясно, какие 2 строки передreturn утверждение в вашем __mul__ должно быть сделано.Также обе строки приведут к ошибке, которую вы видите.

Должен ли ваш __mul__ быть точечным произведением?Если это так, попробуйте:

return self.x*digeri.x + self.y*digeri.y

Еще одно упрощение вашего класса может заключаться в разрешении итерации по вашим координатам, например:

@property
def coords(self):
    return self.x, self.y

def __iter__(self):
    return self.coords.__iter__()

Тогда ваш точечный продукт может выглядеть так:

def dot(self, w):
    """ 
    The dot product of self and other vector w.
    """
    return sum([xi_s * xi_w for xi_s, xi_w in zip(self, w)])

Существует VecPy , очень простой пример класса, который делает подобные вещи.Может быть, взгляд может дать вам больше идей.

0 голосов
/ 15 марта 2019

Ошибка связана с

self.x = Vektor(self.x + digeri.x)

Когда мы называем Vector как способ написания синтаксиса, он думает, что вы хотите его инициализировать, и он ожидает два ввода.Просто избавьтесь от первых двух строчек многофункциональной функции, чтобы решить проблему.

...