Наследование класса в python

Я решаю эту проблему:

Рассмотрим следующую иерархию классов:

class Person(object):     
    def __init__(self, name):         
        self.name = name     
    def say(self, stuff):         
        return self.name + ' says: ' + stuff     
    def __str__(self):         
        return self.name  

class Lecturer(Person):     
    def lecture(self, stuff):         
        return 'I believe that ' + Person.say(self, stuff)  

class Professor(Lecturer): 
    def say(self, stuff): 
        return self.name + ' says: ' + self.lecture(stuff)

class ArrogantProfessor(Professor): 
    def say(self, stuff): 
        return 'It is obvious that ' + self.say(stuff)

Как написано, этот код приводит к бесконечному циклу при использовании Класс высокомерного профессора.

Измените определение ArrogantProfessor так, чтобы следующее поведение достигается:

e = Person('eric') 
le = Lecturer('eric') 
pe = Professor('eric') 
ae = ArrogantProfessor('eric')

e.say('the sky is blue')              #returns   eric says: the sky is blue

le.say('the sky is blue')             #returns   eric says: the sky is blue

le.lecture('the sky is blue')         #returns   believe that eric says: the sky is blue

pe.say('the sky is blue')             #returns   eric says: I believe that eric says: the sky is blue

pe.lecture('the sky is blue')     #returns   believe that eric says: the sky is blue

ae.say('the sky is blue')         #returns   eric says: It is obvious that eric says: the sky is blue

ae.lecture('the sky is blue')     #returns   It is obvious that eric says: the sky is blue

Мое решение:

class ArrogantProfessor(Person):
    def say(self, stuff):
        return Person.say(self, ' It is obvious that ') +  Person.say(self,stuff)
    def lecture(self, stuff):
        return 'It is obvious that  ' + Person.say(self, stuff)

Но контролер дает только половину знаков для этого решения. Какова ошибка, которую я делаю, и каковы тестовые примеры, из-за которых этот код выходит из строя? (Я новичок в python и узнал о классах некоторое время назад.)

Ответ 1

Вы, вероятно, должны использовать super() вместо жесткой проводки класса Person:

class ArrogantProfessor(Person):
    def say(self, stuff):
        return super(ArrogantProfessor, self).say(self.lecture(stuff))
    def lecture(self, stuff):
        return 'It is obvious that ' + super(ArrogantProfessor, self).say(stuff)

Ответ 2

Было указано, что:

class ArrogantProfessor(Professor): 

но вы сделали это:

class ArrogantProfessor(Person): 

что привело к получению разряда.

Ответ 3

Как бывший грейдер кодирования hw, я полагаю, вы должны были создать желаемый результат, не делая ArrogantProfessor просто Person. В конце концов, имя класса указывает, что он все еще должен быть подклассом Professor.

Ответ 4

Вероятно, он хочет, чтобы вы действительно получили родительский класс. Способ сделать это прост.

python2/3:

class ArrogantProfessor(Professor):
    def say(self, stuff):
        return 'It is obvious that ' + super(ArrogantProfessor, self).say(stuff)

Только Python 3:

class ArrogantProfessor(Professor):
    def say(self, stuff):
        return 'It is obvious that ' + super().say(stuff)

В любом случае ae.say("something") должен возвращать:

"It is obvious that eric says: I believe that eric says: something"

Это потому, что родительский класс Professor, а не Person.

Аналогично, в вашем классе лекций вы должны:

def lecture(self, stuff):
    return 'I believe that ' + super(Lecturer, self).say(self, stuff) # or the Python3 version if you're using that

Не совсем понятно, что именно вы хотите.

Ответ 5

Это должно быть:

class ArrogantProfessor( Professor ):
    def lecture(self, stuff):
        return 'It is obvious that ' +  Person.say(self,stuff)

Вам не нужно определять say() в ArrogantProfessor, потому что он уже определен в Professor, и он будет использовать метод lecture(), определенный в дочернем классе.

Ответ 6

Это немного сложно сказать, не зная, что они пытаются научить вас. Вероятная догадка заключается в том, что вас обучают наследованию, и если они перешли super, скорее всего, они хотят, чтобы вы ее использовали для выхода из отчета ArrogantProfessor:

eric says: It is obvious that STUFF

Где STUFF - это строка, в которой вы проходите.

Ответ 7

     class Professor(Lecturer): 
        def say(self, stuff): 
            return "Prof. " + self.name + ' says: ' + self.lecture(stuff)

     class ArrogantProfessor( Professor ):
        def lecture(self, stuff):         
            return 'It is obvious that I believe that ' + Person.say(self, stuff)

Ответ 8

Для второй части правильный ответ:

class ArrogantProfessor(Professor):
    def lecture(self, stuff):
        return 'It is obvious that ' +  Lecturer.lecture(self,stuff)

Ответ 9

для первой части код:

class ArrogantProfessor( Professor ):
def lecture(self, stuff):
    return 'It is obvious that ' +  Person.say(self,stuff)

для второй части код:

class ArrogantProfessor(Professor):
def lecture(self, stuff):
    return 'It is obvious that I believe that ' +  Person.say(self,stuff)

для третьей части код:

class Professor(Lecturer):
 def say(self, stuff): 
     return 'Prof. ' + self.name + ' says: ' + self.lecture(stuff)

Надеюсь, что полезно