【问题标题】:Equality and inheritance in pythonpython中的平等和继承
【发布时间】:2017-07-20 13:26:42
【问题描述】:

在阅读有关如何在 python 中实现 __eq__ 时,例如在 this SO question 中,您会得到类似的建议

class A(object):
    def __init__(self, a, b):
        self._a = a
        self._b = b

    def __eq__(self, other):
        return (self._a, self._b) == (other._a, other._b)

现在,我在将其与继承结合时遇到了问题。具体来说,如果我定义一个新类

class B(A):
    def new_method(self):
        return self._a + self._b

然后我得到这个问题

>>> a = A(1, 2)
>>> b = B(1, 2)
>>> a == b
True

但很明显,ab 并不是(完全)相同的!

用继承实现__eq__的正确方法是什么?

【问题讨论】:

  • 你如何定义平等? type 是平等测试的重要组成部分吗,例如1 == TrueTrue 但显然它们不是同一类型。从a 的角度来看,b 不等于a。您可以为 ba == b 实现不同的相等性,但这并不意味着 b == a

标签: python inheritance equality


【解决方案1】:

如果您的意思是不同(子)类的实例不应该相等,请考虑比较它们的类型:

def __eq__(self, other):
    return (self._a, self._b, type(self)) == (other._a, other._b, type(other))

这样A(1, 2) == B(1,2) 返回False

【讨论】:

    【解决方案2】:

    在对两种类型的对象进行比较时,其中一种类型派生自另一种类型,Python 确保在派生类上调用运算符方法(在本例中为 B)。

    因此,为了确保B 对象与A 对象的比较不同,您可以在B 中定义__eq__

    class B(A):
        def __eq__(self, other):
            return isinstance(other, B) and super(B, self).__eq__(other)
    

    【讨论】:

    • @AChampion B.__eq__ 覆盖A.__eq__,所以a == b 调用B.__eq__(b, a)Example.
    • 我的假设不好,谢谢。鉴于a 的类型是A 而不是B,这是否合理。
    猜你喜欢
    • 2023-04-06
    • 2014-09-07
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2011-08-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多