2014-12-08 2 views
1
class Airplane: 

    def __init__(self, plane_model, serial_num, num_seats, miles_travelled): 
     self.model = plane_model 
     self.serial = serial_num 
     self.seat = num_seats 
     self.miles = miles_travelled 

class Flight: 

    def __init__(self, plane): 
     self.passangers = [] 
     self.airplane = plane 

Я пытаюсь выполнить следующую функцию:Наследование не имеет атрибута?

def add(self, passenger): 
     """(Flight, str) -> bool 

     If there are still seats avalaible on this flight, add passenger to the passenger list.  
     Return true iff passenger is added to this flight. 

     >>> a = Airplane('Cesna 150E', '9378', 1, 824.8) 
     >>> f = Flight(a) 
     >>> f.add('Myrto') # Decreases the seat by 1 
     True 
     >>> f.add('Jen') # No more seats avalaible 
     False 
     """ 

До сих пор моя попытка:

 if self.seat > 0: 
      self.seat -= 1 #num_seats 
      return True 
     else: 
      return False 

Конечно, естественно, экземпляр переменной num_seats будет уменьшаться на единицу, если пассажир добавлен. Количество доступных мест указано по третьему параметру в классе Airplane.

Если я использую функцию, которую я разработал, пытающегося точно такое же действие, как в строку документации возвращает следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "<pyshell#18>", line 1, in <module> 
    f.add('a') 
    File "/Users/N/Desktop/Untitled.py", line 39, in add 
    if self.seat > 0: 
AttributeError: 'Flight' object has no attribute 'seat' 

Я думаю, что может быть что-то отсутствует, но я не уверен, что это.

+2

Вы имели в виду 'self.plane.seat'? – jonrsharpe

+1

Кроме того, ваше название упоминает * «наследование» *, но * у вас на самом деле нет *. Если 'Flight' должен унаследовать от' Самолета' (я не думаю, что это должно быть, а состав, а не наследование, здесь правильный выбор), он должен быть «class Flight (Самолет):'. – jonrsharpe

+0

Да, вы правы, это должна быть композиция, а не наследование. Мои извинения. Я решил это, используя self.airplane.seat, хотя. Возможно, мне нужно обратиться к классу с атрибутом self.seat. – amundi12

ответ

1

Ваша специфическая ошибка в том, что Flight экземпляр не имеет атрибут seat, это является атрибутом Airplane экземпляра и, следовательно, должны быть доступны через атрибут self.airplane (который обеспечивает связь с Airplane экземпляра, который будет использоваться для Flight экземпляр):

if self.airplane.seat > 0: 
     #^access via 'airplane' attribute 

Однако, я думаю, что ваше моделирование немного не обычно. Добавление пассажиров изменяет количество свободных мест на примере Flight, но не изменяет количество мест на примере Airplane (насколько я знаю, они не начинают снимать сиденья из как люди заказывают!) Кроме того, расстояние, которое нужно проехать, - это свойство полета, а не самолёт. Имея это в виду, я бы реализовать как:

class Airplane(object): 

    def __init__(self, model, seats): 
     self.model = model 
     self.seats = seats 


class Flight(object): 

    def __init__(self, plane, code, distance): 
     self.plane = plane 
     self.code = code 
     self.distance = distance 
     self.passengers = [] 

    @property 
    def free_seats(self): 
     return self.plane.seats - len(self.passengers) 

    def add(self, passenger): 
     if not self.free_seats: 
      raise Exception("Flight full.") 
     self.passengers.append(passenger) 

Обратите внимание, что Flight.add проверки, чтобы гарантировать, что текущий passengers список будет вписываться в plane.seats. Нет необходимости сохранять отдельный атрибут - free_seats может быть рассчитан из других атрибутов, поэтому я сделал его только для чтения property. При использовании:

>>> f = Flight(Airplane("747", 5), "BA0123", 123) 
>>> for person in ['John Cleese', 'Terry Gilliam', 'Eric Idle', 'Terry Jones', 'Michael Palin']: 
    f.add(person) 


>>> f.passengers 
['John Cleese', 'Terry Gilliam', 'Eric Idle', 'Terry Jones', 'Michael Palin'] 
>>> f.add('Graham Chapman') 

Traceback (most recent call last): 
    File "<pyshell#32>", line 1, in <module> 
    f.add('Graham Chapman') 
    File "<pyshell#25>", line 13, in add 
    raise Exception("Flight full.") 
Exception: Flight full. 
>>> f.free_seats 
0 

(. Не волнуйтесь, в прошлом ухода Грэма в этой точке)

Это не вполне соответствует вашей спецификации, так как Flight.add Теперь возникает ошибку, если рейс заполнен, вместо возвращения False. Это более питоновский способ кодирования; см. "Easier to ask for forgiveness than permission".