Невозможно реализовать оператор __lt__ - PullRequest
0 голосов
/ 19 марта 2020

У меня есть класс Quantity, и я хочу реализовать оператор __lt__ для перегрузки. Я реализовал метод, как показано ниже.

    def __lt__(self, other):
        if isinstance(other, Quantity):
            return other.value < self.value
        if isinstance(other, numbers.Real):
            return self.value < other
        raise NotImplemented

Когда я импортирую его в консоль python и пытаюсь выполнить его

>>> Quantity(1.2) > 1

Я получаю следующую ошибку

AttributeError: 'int' object has no attribute 'number'

И если я пытаюсь выполнить его следующим образом

>>> Quantity(1.2) < 1

Я получаю следующую ошибку

TypeError: '<' not supported between instances of 'Quantity' and 'int'

Кто-нибудь знает, как я могу реализовать перегрузку для работы с < и >?

Обновление

Вот полный класс

class Quantity:

    def __init__(self, value):
        self.value = float(value)

    def __float__(self):
        return self.value

    def __repr__(self):
        return 'Quantity({})'.format(self.value)

    def __str__(self):
        return str(self.value)


   def __lt__(self, other):
        if isinstance(other, Quantity):
            return other.value < self.value
        if isinstance(other, numbers.Real):
            return self.value > other
        raise NotImplemented

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, value):
        value = round(value, 10)
        self._value = int(value * 1000) / 1000.0

1 Ответ

1 голос
/ 19 марта 2020

Вы получаете сообщение об ошибке Quantity(1.2) > 1, так как вы не определили __gt__ для своего Quantity класса. Как указывалось, у вас также есть ошибка в вашем __lt__ методе и вы выполняете сравнение неправильно (other.value < self.value вместо self.value < other.value). Я считаю, что это должно работать:

def __lt__(self, other):                                                    
    if isinstance(other, Quantity):                                         
        return self.value < other.value                                     
    if isinstance(other, numbers.Real):                                     
        return self.value < other                                           
    raise NotImplemented                                                    

def __gt__(self, other):                                                    
    if isinstance(other, Quantity):                                         
        return self.value > other.value                                     
    if isinstance(other, numbers.Real):                                     
        return self.value > other                                           
    raise NotImplemented

Ваш второй пример, Quantity(1.2) < 1 должен работать. Похоже, сообщение об ошибке, которое вы цитируете, не воспроизводимо (я проверил python 2.7 и 3.8).

...