链重载比较运算符

时间:2015-03-11 22:44:44

标签: python python-2.7 python-3.x

我想做这样的事情:

MyClass > 200 < 400  

该类实现了__gt__()__lt__()方法,它们都返回self

class MyClass:

    ...

    def __gt__(self, value):
        DoCompareStuff(self, value)
        return self

    def __lt__(self, value):
        DoCompareStuff(self, value)
        return self

   ...

它会进行第一次评估MyClass > 200,但绝不会执行第二次评估,MyClass < 400。似乎Python正在使用返回值执行某些操作,例如使其成为TrueFalse。有没有办法做我想在这里做的事情?

2 个答案:

答案 0 :(得分:4)

运算符链接进行比较(参见the docs)表示

MyClass > 200 < 400 

实际上被评估为:

(MyClass > 200) and (200 < 400)

因此,MyClass400之间无法进行比较。相反,你想要:

200 < MyClass < 400

评估为:

(200 < MyClass) and (MyClass < 400)

更简单的例子:

>>> class Demo(object):

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

    def __lt__(self, other):
        return self.value < other

    def __gt__(self, other):
        return self.value > other


>>> demo = Demo(250)
>>> 200 < demo < 400
True

注意这里的__lt____gt__实现有一个布尔返回值(TrueFalse),而不是返回{{1 (这将导致意外行为)。

答案 1 :(得分:1)

首先,这段代码没有意义:

MyClass > 200 < 400 

随着它扩展到:

MyClass > 200 and 200 < 400 

哪个解析为:

MyClass > 200

其次,当涉及到布尔值时,Python有一个强大的"truthiness"概念。这实际上意味着任何非零的东西都是“真实的”。

最后,当你有这段代码时:

def __gt__(self, value):
    DoCompareStuff(self, value)
    return self

由于self将是某种类型的对象,因此始终始终 * 是真的。例如,这两个都将评估为true,因为您将返回self

10 < MyClassInstance
10 > MyClassInstance

*有时,except when you implement the __bool__ method。 (谢谢@wim)