Python相等性优先级

19
class L(object):
    def __eq__(self, other):
        print 'invoked L.__eq__'
        return False

class R(object):
    def __eq__(self, other):
        print 'invoked R.__eq__'
        return False

left = L()
right = R()

使用这段代码,左侧首先进行比较,根据数据模型所记录

>>> left == right
invoked L.__eq__
False

但是,如果我们对第6行进行轻微修改(其他不变):

class R(L):

现在轮到右侧先进行比较。

>>> left == right
invoked R.__eq__
False

为什么这样设计?在哪里有记录,设计决策的理由是什么?

1个回答

19

这在数字操作部分有详细说明,页面下方还解释了它的工作原理:

注意:如果右边的操作数类型是左边操作数类型的子类,并且该子类提供了操作的反射方法,则会在左操作数的非反射方法之前调用此方法。这种行为允许子类覆盖其祖先的操作。

在你正在查看的部分中,Python 3 文档 还进一步提到了它:

如果操作数是不同的类型,并且右操作数的类型是左操作数的直接或间接子类,则右操作数的反射方法具有优先权,否则左操作数的方法具有优先权。虚拟子类不被考虑。


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