python中的平等和继承

python中的平等和继承,python,inheritance,equality,Python,Inheritance,Equality,当阅读关于如何在python中实现\uuuuu eq\uuuu的文章时,您会得到如下建议 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) 现在,我在结合继承时遇到了问题。具体来说,如果我定义一个新

当阅读关于如何在python中实现
\uuuuu eq\uuuu
的文章时,您会得到如下建议

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
但是很明显,
a
b
并不完全相同


< P> >用继承继承正确的方法来实现<代码> > qq> < />代码>

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

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

<> > <代码> a(1, 2)=b(1,2)返回<代码> false .< /p> 如果您表示不同(子)类的实例不相等,请考虑比较它们的类型:

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

通过这种方式
A(1,2)==B(1,2)
返回
False

当在两种类型的对象之间执行比较时,其中一种类型是从另一种类型派生的,Python确保对派生类调用操作符方法(在这种情况下,
B

因此,为了确保
B
对象与
A
对象进行不同的比较,您可以在
B
中定义
\uuuuuuu eq\uuuu

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

当在两种类型的对象之间执行比较时,其中一种类型派生自另一种类型,Python确保对派生类调用运算符方法(在本例中,
B

因此,为了确保
B
对象与
A
对象进行不同的比较,您可以在
B
中定义
\uuuuuuu eq\uuuu

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

你如何定义平等?
type
是否是平等测试的一个重要部分,例如
1==True
Is
True
但显然它们不是同一类型。从
a
的角度来看,
b
不等于
a
。对于
b
a==b
,您可能会以不同的方式实现相等,但这并不意味着
b==a
。您如何定义相等?
type
是否是平等测试的一个重要部分,例如
1==True
Is
True
但显然它们不是同一类型。从
a
的角度来看,
b
不等于
a
。您可以为
b
a==b
以不同的方式实现相等,但这并不意味着
b==a
@AChampion
b.。\uuuuueq\uuuuuuuuuu>覆盖
a.\uuuueq\uuuuu
,因此
a==b
调用
b.\uuuuuueq\uuuuu(b,a)
。这是我的错误假设,谢谢。对于这个给定的
a
类型
a
而不是
B
@AChampion
B,是否有合理的理由?。\uuuuuueq\uuuuuu>覆盖
a.\uuuuueq\uuuuuu
,因此
a==B
调用
B.\uuuueq\uuuuu(B,a)
。这是我的错误假设,谢谢。对于给定的
a
类型为
a
而非
B
,是否有合理的解释。