2016-03-12 2 views
12

Я решить эту проблему:наследование классов в 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 и узнал о классах некоторое время назад.)

+0

Это опечатка в растворе для ' le.lecture («небо голубое»), или действительно ли местоимение «Я» отсутствует? – L3viathan

+0

@ L3viathan, который был опечаткой –

ответ

7

Вы, вероятно, следует использовать 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

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

2

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

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 

Это не совсем ясно, что это такое, что вы хотите, хотя.

4

Это было сказано, что:

class ArrogantProfessor(Professor): 

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

class ArrogantProfessor(Person): 

что привело к половинной класса.

+0

На самом деле я впервые использовал профессора в качестве аргумента, но это не сработало, поэтому я изменил это на Person –

+1

. Это была цель assigment @johnsmith! Чтобы вы подумали *, как заставить его работать с «Профессором». Хороший вопрос кстати, у вас есть мой взлет. – gsamaras

2

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

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

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

2

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

eric says: It is obvious that STUFF 

Где STUFF это строка, . «повторно проходит в

0
 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) 
+0

У вас должен быть контекст для вашего ответа, а не только код. – Jeff

0

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

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

для части один код:

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) 

Надеется, что это полезно

Смежные вопросы