Почему атрибут равенства класса вызывает себя снова и снова? - PullRequest
0 голосов
/ 12 февраля 2019

Я использую MIT OCW и только что узнал о занятиях.Поэтому, когда метод равенства вызывается для пары экземпляров, мой код (отредактированный из оригинала) вызывает себя снова и снова.Код выглядит следующим образом:

class Animal(object):
def __init__(self, age):
    self.age = age
    self.name = None
def __str__(self):
    return "animal:"+str(self.name)+":"+str(self.age)


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 __eq__(self, other):
        print('entering equality')
        print(self.parent1)
        print(self.parent2)
        parents_same = self.parent1== other.parent1 and self.parent2== other.parent2
        print('1st comp')
        parents_opposite = self.parent2 == other.parent1 and self.parent1== other.parent2
        print('2nd comp')
        return parents_same or parents_opposite

a=Rabbit(6)
b=Rabbit(7)
c=Rabbit(5,a,b)
d=Rabbit(3,a,b)
e=Rabbit(2,c,d)
f=Rabbit(1,c,d)

print(e==f)

Когда этот код выполняется, видно, что Python входит в цикл равенства несколько раз.Ниже приведен исходный атрибут eq :

def __eq__(self, other):
    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

Код прекрасно работает с исходным атрибутом равенства.Может кто-нибудь объяснить мне, почему это происходит.Спасибо.

1 Ответ

0 голосов
/ 12 февраля 2019

Потому что вы проверяете множественность кроликов на равенство!Родители объектов e, f тоже кролики, и у каждого из них есть кролики для родителей.Таким образом, каждая проверка на равенство будет вызывать Rabbit.__eq__ рекурсивно, пока вы не доберетесь до a и b

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...