Наследование класса в 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)
Надеюсь, что полезно