我想做这样的事情:
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正在使用返回值执行某些操作,例如使其成为True
或False
。有没有办法做我想在这里做的事情?
答案 0 :(得分:4)
运算符链接进行比较(参见the docs)表示
MyClass > 200 < 400
实际上被评估为:
(MyClass > 200) and (200 < 400)
因此,MyClass
和400
之间无法进行比较。相反,你想要:
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__
实现有一个布尔返回值(True
或False
),而不是返回{{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)