我读了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__
是否相等?我读了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__
是否相等?z.__rand__(s)
。__radd__
,__rsub__
等形式存在。a & b
时,调用a.__and__(b)
不存在或返回NotImplemented
,它会尝试(作为“最后的手段”)调用b.__rand__(a)
。z
的类没有实现__and__
,因此它会回退到提供__rand__
的s
。
s
而不是z
的方法,第二个例子使用s.__rand__
是因为s
在&
运算符的右边。 - khelwoodz
没有__and__
方法或者该方法返回NotImplemented
,那么只有在这种情况下才会调用s.__rand__(z)
(但在set
作为一个由C语言编写的内部类型的情况下,可能根本不会被调用)。 - L3viathan