【问题标题】:Cannot implement __lt__ operator无法实现 __lt__ 运算符
【发布时间】:2020-06-30 16:47:45
【问题描述】:

我有一个类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'

有谁知道如何实现重载以使用&lt;&gt;

更新

这是完整的课程

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

【问题讨论】:

  • 什么是Quantitynumbers 是什么?此外,如果self.value 大于 大于other.value,您的第一个if 语句将返回True
  • 对我来说第一个引发异常,第二个有效,请再次检查
  • @C.Nivs 我更新了帖子,以便显示整个班级。

标签: python operator-overloading


【解决方案1】:

您在Quantity(1.2) &gt; 1 上收到错误,因为您没有为您的Quantity 类定义__gt__。正如所指出的,您的__lt__ 方法也有错误,并且以错误的方式执行比较(other.value &lt; self.value 而不是self.value &lt; 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) &lt; 1 应该可以工作。您引用的错误消息似乎不可重现(我检查了 python 2.7 和 3.8)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多