Dziedziczenie wielokrotne: Ptak

Zadanie 5 z 7 · rozdział 19Trudność: 2 z 3multiple inheritancedziedziczeniemetody

Treść zadania

Zaprojektuj klasy:

  • Zwierz — konstruktor __init__(self, imie) zapamiętuje imię. Metody:
    • jedz() → wypisuje <imię> je.
    • spij() → wypisuje <imię> śpi.
    • wydaj_dzwiek() → wypisuje <imię> wydaje dźwięk.
  • ObiektLatajacy — konstruktor __init__(self, imie) zapamiętuje imię i ustawia stan „na ziemi” (np. atrybut w_powietrzu = False). Metody:
    • lec() → jeśli obiekt jest na ziemi, wypisuje <imię> leci. i przechodzi w stan „w powietrzu”; jeśli już jest w powietrzu, wypisuje <imię> już leci.
    • wyladuj() → jeśli obiekt jest w powietrzu, wypisuje <imię> ląduje. i przechodzi w stan „na ziemi”; jeśli już jest na ziemi, wypisuje <imię> jest już na ziemi.
  • Ptak — dziedziczy jednocześnie po Zwierz i ObiektLatajacy. Jego konstruktor wywołuje konstruktory obu klas bazowych. Ptak nie definiuje żadnych innych metod — wszystkie dziedziczy.

Program wczytuje imię ptaka, tworzy obiekt Ptak (na początku jest na ziemi), a następnie wykonuje kolejne polecenia — każde polecenie to nazwa metody do wywołania.

Dane wejściowe

  • 1. linia: imię ptaka (może zawierać spacje)
  • 2. linia: liczba poleceń $n$
  • kolejne $n$ linii: polecenie — jedno z: jedz, spij, wydaj_dzwiek, lec, wyladuj

Dane wyjściowe

$n$ linii — komunikaty wypisane przez kolejno wywołane metody.

Ograniczenia

  • $1 \le n \le 50$

Uwagi

  • Przy dziedziczeniu wielokrotnym najprościej wywołać konstruktory klas bazowych jawnie: Zwierz.__init__(self, imie) oraz ObiektLatajacy.__init__(self, imie).

Przykład

Wejście
Ptak
5
jedz
spij
wydaj_dzwiek
lec
wyladuj
Wyjście
Ptak je.
Ptak śpi.
Ptak wydaje dźwięk.
Ptak leci.
Ptak ląduje.
Zasady obowiązujące w rozdziale 19

Zadania w tym rozdziale uczą dziedziczenia: klasa potomna przejmuje atrybuty i metody klasy bazowej, może je nadpisać (override) albo rozszerzyć, wywołując wersję z klasy bazowej przez super(). Dzięki polimorfizmowi ten sam kod (np. pętla po liście obiektów) wywołuje metodę odpowiednią dla konkretnej klasy obiektu. Dziedziczenie przydaje się też przy wyjątkach: własne wyjątki to klasy dziedziczące po Exception, które można układać w hierarchie.

Konwencje wspólne:

  • Każde zadanie to osobny program: czyta standardowe wejście i wypisuje wynik na standardowe wyjście.
  • W każdym zadaniu dostajesz kod startowy ze szkieletami klas i gotowym wczytywaniem danych. Twoim zadaniem jest uzupełnienie klas — wynik programu zależy od tego, jak działają Twoje klasy.
  • Nazwy klas i metod podane w treści są obowiązkowe (kod startowy z nich korzysta). Nazwy w kodzie piszemy bez polskich znaków, np. Kolo, Czlowiek.
  • „Z dokładnością do 2 miejsc po przecinku” oznacza dokładnie dwie cyfry po kropce, np. f"{x:.2f}" (3.00, 4.50).
  • Program nie wypisuje komunikatów typu „Podaj liczbę:”.

Zadanie pochodzi z otwartego zbioru Nauka-Programowania (z rozwiązaniami wzorcowymi). Zgłoś błąd w treści lub testach.

Python uruchomi się w przeglądarce przy pierwszym teście.

Kod zapisuje się automatycznie w tej przeglądarce. Tab wstawia wcięcie; aby opuścić edytor klawiaturą, naciśnij Esc, a potem Tab.

Testy

Program dostaje „Wejście” przez input() i musi wypisać „Oczekiwane wyjście”. Liczby porównywane są z tolerancją 0,01, a tekst podany w input("…") nie jest sprawdzany.

Test 1

Nie uruchomiono
Wejście
Kos
4
lec
lec
wyladuj
wyladuj
Oczekiwane wyjście
Kos leci.
Kos już leci.
Kos ląduje.
Kos jest już na ziemi.

Test 2

Nie uruchomiono
Wejście
Wróbel
1
wyladuj
Oczekiwane wyjście
Wróbel jest już na ziemi.

Test 3

Nie uruchomiono
Wejście
Sowa
6
lec
jedz
wyladuj
spij
wydaj_dzwiek
lec
Oczekiwane wyjście
Sowa leci.
Sowa je.
Sowa ląduje.
Sowa śpi.
Sowa wydaje dźwięk.
Sowa leci.

Test 4

Nie uruchomiono
Wejście
Bocian Wojtek
2
wydaj_dzwiek
jedz
Oczekiwane wyjście
Bocian Wojtek wydaje dźwięk.
Bocian Wojtek je.
Uruchom z własnymi danymi