TypeError: неподдерживаемые типы операндов для -: 'Position' и 'Position' - PullRequest
1 голос
/ 19 июня 2020

Предположим, у меня есть класс

class Position():
    def __init__(self, line, column):
        self.line = line
        self.column = column

Я создал delta, но объект типа Position не может использоваться в качестве аргумента.

delta = lambda position1, position2 : tuple(np.abs(np.subtract(position1, position2)))

Допустим, position1 = Position(1,2) и position2 = Position(5,6). Есть ли способ запустить delta(position1, position2) без создания ошибки?

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Вам нужно будет создать в своем классе методы __sub__ и __abs__ magi c. Кроме того, если вы хотите использовать массивы position1 и position2, вам также придется реализовать метод __array_wrap__ magi c.

Кроме того, я не нахожу использования tuple здесь очень уместно. Если вы хотите использовать и это, вам придется изменить реализацию класса Position и вместо этого вернуть объект Sequence.

class Position:
    def __init__(self, a, b): 
        self.a, self.b = a, b

    def __sub__(self, other):
        return Position(self.a - other.a, self.b - other.b)

    def __abs__(self):
        return Position(abs(self.a), abs(self.b))
0 голосов
/ 19 июня 2020

То, что вы возвращаете, например, class, является экземпляром класса, а не последовательностью, например list, tuple, integer, float, ..., не работающим в операциях np.

Следует использовать def __new__, а не __init __

import numpy as np

class Position(tuple):
    def __new__(cls, column, row):
        return super().__new__(cls, (column, row))

delta = lambda position1, position2 : tuple(np.abs(np.subtract(position1, position2)))

position1 = Position(1,2)
position2 = Position(5,6)

print(delta(position1, position2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...