Python 如何比较两个子类是否具有相同的超类?

Python 如何比较两个子类是否具有相同的超类?,python,Python,目前我正在学习Python和继承的概念。当我试图创建一个名为Animal的类及其子类Rabbit时。我还想创建一个特定的方法,从两个交配的小兔子中创建一个小兔子,并比较两个小兔子是否有相同的父母 但是,当我尝试使用下面的示例比较它们时 r1 = Rabbit(3) r2 = Rabbit(4) r3 = r1+r2 r4 = r1+r2 print(r3 == r4) 我首先使用如下(rid只是创建的每个实例的顺序标记) 它是对的,但当我尝试使用: parents_same = self.pa

目前我正在学习Python和继承的概念。当我试图创建一个名为
Animal
的类及其子类
Rabbit
时。我还想创建一个特定的方法,从两个交配的小兔子中创建一个小兔子,并比较两个小兔子是否有相同的父母

但是,当我尝试使用下面的示例比较它们时

r1 = Rabbit(3)
r2 = Rabbit(4)
r3 = r1+r2
r4 = r1+r2
print(r3 == r4)
我首先使用如下(rid只是创建的每个实例的顺序标记)

它是对的,但当我尝试使用:

parents_same = self.parent1 == other.parent1 \
               and self.parent2 == other.parent2
parents_opposite = self.parent2 == other.parent1 \
                   and self.parent1 == other.parent2
return parents_same or parents_opposite
它表明
NoneType
对象没有属性
parent1
。此外,当我修改代码使调试更容易时,它说
self
是类型“string”,而没有属性
parent1
。我对这种情况完全不知所措

我使用的关键代码,可供参考:

class Rabbit(Animal):
tag = 1
def __init__(self, age, parent1=None, parent2=None):
    Animal.__init__(self, age)
    self.parent1 = parent1
    self.parent2 = parent2
    self.rid = Rabbit.tag
    Rabbit.tag += 1
def get_rid(self):
    return str(self.rid).zfill(3)
def get_parent1(self):
    return self.parent1
def get_parent2(self):
    return self.parent2
def __add__(self, other):
    # returning object of same type as this class
    return Rabbit(0, self, other)
def __eq__(self, other):
    # compare the ids of self and other's parents
    parents_same = self.parent1.rid == other.parent1.rid \
                   and self.parent2.rid == other.parent2.rid
    parents_opposite = self.parent2.rid == other.parent1.rid \
                       and self.parent1.rid == other.parent2.rid
    return parents_same or parents_opposite
def __str__(self):
    return "rabbit:"+ self.get_rid()

检查兄弟姐妹关系并不是人们期望==做的事情。在这种情况下,即使是你也不行:你的平等方法要求父母,而不是其他的平等观念。这最终会在没有父对象(或者说没有父对象)的对象上被调用

尽管如此,在这个特定的例子中,这不应该引发错误,因为您正在比较的兔子(r3和r4)具有相同的世代数。但它们总是会比较相等,就像(r1和r2)一样,因为没有一个会比较相等

如果必须使用这个奇怪的相等运算符来测试同级hood,那么至少应该使用python
is
检查父级是否相同,因为它不会有这种递归行为。
但是,如果将r1与r3进行比较,您肯定会得到一个错误。

您当前正在编写的内容是,如果两个兔子对象的父对象相同,则它们是相同的,您可能不希望使用
\uuuu eq\uuu
,因此,添加两个兔子也没有意义。我会为这些东西创建单独的方法。您的完整代码不包括类的任何示例用法,请参见[edit][添加它,这样就有了一个。谢谢你的帮助。我在那里创建了一个用法示例。这似乎与超类无关。此外,使用
+
==
这是很奇怪的。我想你把自己与父类的两个定义混淆了。一个是超类(在您的示例中是
Animal
),另一个是实际的家长图形。检查相同的家长图形与子类/超类无关。除此之外,请生成一个最小且可复制的示例,包括“表示self为type string”的代码.如果你想从SO那里得到帮助,你需要更多地关注你的问题
class Rabbit(Animal):
tag = 1
def __init__(self, age, parent1=None, parent2=None):
    Animal.__init__(self, age)
    self.parent1 = parent1
    self.parent2 = parent2
    self.rid = Rabbit.tag
    Rabbit.tag += 1
def get_rid(self):
    return str(self.rid).zfill(3)
def get_parent1(self):
    return self.parent1
def get_parent2(self):
    return self.parent2
def __add__(self, other):
    # returning object of same type as this class
    return Rabbit(0, self, other)
def __eq__(self, other):
    # compare the ids of self and other's parents
    parents_same = self.parent1.rid == other.parent1.rid \
                   and self.parent2.rid == other.parent2.rid
    parents_opposite = self.parent2.rid == other.parent1.rid \
                       and self.parent1.rid == other.parent2.rid
    return parents_same or parents_opposite
def __str__(self):
    return "rabbit:"+ self.get_rid()