在类集合中,“__and__”和“__rand__”有什么区别?

3

我读了Luciano Ramalho的书"流畅的Python"。在set类的描述中,他写道:

s & z   # s.__and__(z)   - intersection of s and z
z & s   # s.__rand__(z)   - inversion operator &

我不理解为什么在第二种情况下他没有编写:z.__and__(s)。作者说:“s和z的交集”≠“反转运算符&”。
对于set()__and____rand__是否相等?

3
假设作者特别想要解释关于s而不是z的方法,第二个例子使用s.__rand__是因为s&运算符的右边。 - khelwood
4
如果对象z没有__and__方法或者该方法返回NotImplemented,那么只有在这种情况下才会调用s.__rand__(z)(但在set作为一个由C语言编写的内部类型的情况下,可能根本不会被调用)。 - L3viathan
1个回答

4
我不理解。为什么在第二种情况下他不写:z.__rand__(s)
因为这正是反向运算符的关键所在。它们也以__radd____rsub__等形式存在。
如果在执行a & b时,调用a.__and__(b)不存在或返回NotImplemented,它会尝试(作为“最后的手段”)调用b.__rand__(a)
有关详细信息,请参见Python文档的相关部分
在您的示例中,可能z的类没有实现__and__,因此它会回退到提供__rand__s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接