在交互式解释器中,如果您键入以下内容,您可以看到一些非常有趣的内容:
1)help()
2)modules
3)__builtin__
在阅读输出一段时间后,我在class bool
中遇到了这些行:
__or__(...)
x.__or__(y) <==> x|y
然后是:
__ror__(...)
x.__ror__(y) <==> y|x
最后一种方法似乎描述了 reverse或。为什么这种方法存在?什么可能导致__or__(...)
返回与__ror__(...)
不同的任何内容?
答案 0 :(得分:6)
假设您编写自己的整数类,并希望它与内置整数一起使用。您可以定义__or__
class MyInt(int):
def __or__(self, other):
# Not a recommended implementation!
return self | int(other)
这样你就可以编写像
这样的代码了# Because this is equivalent to MyInt.__or__(MyInt(6), 7)
MyInt(6) | 7
然而,Python不知道如何处理
# First interpretation is int.__or__(7, MyInt(6))
7 | MyInt(6)
因为int.__or__
不知道如何使用MyInt
的实例。在这种情况下,Python交换操作数的顺序并尝试
MyInt.__ror__(MyInt(6), 7)
也就是说,在右手参数的类中查找魔术方法的交换版本。