首页 > 解决方案 > 如何比较两个子类是否具有相同的超类?

问题描述

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

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

r1 = Rabbit(3)
r2 = Rabbit(4)
r3 = r1+r2
r4 = r1+r2
print(r3 == r4)

我首先使用如下(rid 只是创建的每个实例的顺序标记)

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

它是正确的,但是当我尝试使用时:

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是类型“字符串”并且没有属性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()

标签: python

解决方案


检查兄弟身份并不是人们期望 == 做的事情。在这种情况下,甚至你也不是:你的平等方法调用父母而不是其他一些平等的概念。这最终会被调用到没有父对象(或者更确切地说是 None 的父对象)的对象上。

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

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


推荐阅读