Dziedziczenie wielokrotne: Ptak
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. atrybutw_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 poZwierziObiektLatajacy. Jego konstruktor wywołuje konstruktory obu klas bazowych.Ptaknie 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)orazObiektLatajacy.__init__(self, imie).
Przykład
Ptak 5 jedz spij wydaj_dzwiek lec wyladuj
Ptak je. Ptak śpi. Ptak wydaje dźwięk. Ptak leci. Ptak ląduje.
Potrzebujesz teorii?
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.
Przywrócono Twój zapisany kod.
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 uruchomionoKos 4 lec lec wyladuj wyladuj
Kos leci. Kos już leci. Kos ląduje. Kos jest już na ziemi.
Test 2
Nie uruchomionoWróbel 1 wyladuj
Wróbel jest już na ziemi.
Test 3
Nie uruchomionoSowa 6 lec jedz wyladuj spij wydaj_dzwiek lec
Sowa leci. Sowa je. Sowa ląduje. Sowa śpi. Sowa wydaje dźwięk. Sowa leci.
Test 4
Nie uruchomionoBocian Wojtek 2 wydaj_dzwiek jedz
Bocian Wojtek wydaje dźwięk. Bocian Wojtek je.