`foo < 是什么方法?条< baz` 实际上调用?
在Python中我们可以说:
if foo < bar < baz:
do something.
同样,我们可以重载比较运算符,例如:
class Bar:
def __lt__(self, other):
do something else
但是实际上调用了这些区间比较的操作数类型的哪些方法?上面的内容相当于
if foo.__lt__(bar) and bar.__lt__(baz):
do something.
编辑:re S.Lott,这里有一些输出有助于说明实际发生的情况。
>>> class Bar:
def __init__(self, name):
self.name = name
print('__init__', self.name)
def __lt__(self, other):
print('__lt__', self.name, other.name)
return self.name < other.name
>>> Bar('a') < Bar('b') < Bar('c')
('__init__', 'a')
('__init__', 'b')
('__lt__', 'a', 'b')
('__init__', 'c')
('__lt__', 'b', 'c')
True
>>> Bar('b') < Bar('a') < Bar('c')
('__init__', 'b')
('__init__', 'a')
('__lt__', 'b', 'a')
False
>>>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
相当于
有一个重要的区别:如果 bar 是一个变异,它将被缓存。即:
相当于
但要回答你的问题,它最终会是:
is equivalent to
with one important distinction: if bar is a mutating, it will be cached. I.e.:
is equivalent to
But to answer your question, it will end up being:
你是对的:
输出:
You are correct:
Output:
它使用对小于比较运算符的连续调用:
It uses successive calls to the less-than comparison operator:
它调用特殊方法
__lt__()
,如果需要,它将调用__nonzero__()
将__lt__()
的结果强制为布尔值。令人惊讶的是(至少对我来说),没有__and__()
方法来重写and
运算符。这是一个测试程序:
输出:
It calls the special method
__lt__()
, and if needed it will call__nonzero__()
to coerce the result of__lt__()
to a boolean. Surprisingly (to me at least), there is no__and__()
method to override theand
operator.Here's a test program:
Output: