python - 如何比较两个子类是否具有相同的超类?
问题描述
目前我正在学习 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()
解决方案
检查兄弟身份并不是人们期望 == 做的事情。在这种情况下,甚至你也不是:你的平等方法调用父母而不是其他一些平等的概念。这最终会被调用到没有父对象(或者更确切地说是 None 的父对象)的对象上。
尽管如此,这不应该在这个特定示例中引发错误,因为您要比较的兔子(r3 和 r4)具有相同的世代数。但它们总是比较相等,(r1 和 r2)也一样,因为 None 比较等于 None。
如果你必须有这个奇怪的相等运算符来测试兄弟罩,你至少应该使用 python 检查父母是否相同is
,它不会有这种递归行为。但是,如果将 r1 与 r3 进行比较,您肯定会得到一个错误。
推荐阅读
- python - Python中的锯齿线
- python - 信号发出后 QML AppWindow 不更新
- jquery - 在 React JQuery 上将 Https 替换为 http
- sql - SQL Server - 选项窗口中的重叠文本
- php - 将邮件服务器添加到 PHP 页面
- html - 在 Chrome 中从 HTML 打印 PDF
- excel - 试图找到一种方法防止在 Excel VBA 中出现类型不匹配错误
- c# - 将 json 字符串反序列化为结构会导致异常
- python - Selenium python-如果我的脚本在调用 driver.close() 之前失败,并且我再次调用该函数,我会打开两个驱动程序吗?
- laravel - 如何使用 Guzzle 在我的 Laravel API 上发布和接收数据