python中的平等和继承
当阅读关于如何在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) 现在,我在结合继承时遇到了问题。具体来说,如果我定义一个新
\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
IsTrue
但显然它们不是同一类型。从a
的角度来看,b
不等于a
。对于b
,a==b
,您可能会以不同的方式实现相等,但这并不意味着b==a
。您如何定义相等?type
是否是平等测试的一个重要部分,例如1==True
IsTrue
但显然它们不是同一类型。从a
的角度来看,b
不等于a
。您可以为b
,a==b
以不同的方式实现相等,但这并不意味着b==a
@AChampionb.。\uuuuueq\uuuuuuuuuu>覆盖a.\uuuueq\uuuuu
,因此a==b
调用b.\uuuuuueq\uuuuu(b,a)
。这是我的错误假设,谢谢。对于这个给定的a
类型a
而不是B
@AChampionB,是否有合理的理由?。\uuuuuueq\uuuuuu>覆盖a.\uuuuueq\uuuuuu
,因此a==B
调用B.\uuuueq\uuuuu(B,a)
。这是我的错误假设,谢谢。对于给定的a
类型为a
而非B
,是否有合理的解释。