Polimorfizm: Zwierz, Pies i Kot

Zadanie 3 z 7 · rozdział 19Trudność: 2 z 3dziedziczeniepolimorfizmoverride

Treść zadania

Zaprojektuj klasy:

  • Zwierz — konstruktor __init__(self, imie) zapamiętuje imię zwierzęcia. Metoda odglos() zwraca napis ... (ogólny, nieokreślony dźwięk). Metoda przedstaw_sie() wypisuje linię:
    `
    <NazwaKlasy> <imię> wydaje odgłos: <odgłos>
    `
    gdzie <NazwaKlasy> to nazwa klasy obiektu (Zwierz, Pies albo Kot), a <odgłos> to wynik metody odglos().
  • Pies — dziedziczy po Zwierz i nadpisuje odglos(), która zwraca Hau!.
  • Kot — dziedziczy po Zwierz i nadpisuje odglos(), która zwraca Miau!.

Klasy Pies i Kot nie definiują własnej metody przedstaw_sie() — korzystają z odziedziczonej. Dzięki polimorfizmowi wywołanie self.odglos() wewnątrz przedstaw_sie() uruchomi wersję metody właściwą dla klasy obiektu.

Program wczytuje listę zwierząt, umieszcza je w jednej liście i dla każdego (w kolejności z wejścia) wywołuje przedstaw_sie().

Dane wejściowe

  • 1. linia: liczba zwierząt $n$
  • kolejne $n$ linii: rodzaj zwierzęcia (zwierz, pies albo kot) i jego imię (jedno słowo), oddzielone spacją

Dane wyjściowe

$n$ linii — po jednej dla każdego zwierzęcia, w formacie podanym w treści.

Ograniczenia

  • $1 \le n \le 20$

Uwagi

  • Nazwę klasy obiektu można odczytać wyrażeniem type(self).__name__.

Przykład

Wejście
3
zwierz Gucio
pies Burek
kot Mruczek
Wyjście
Zwierz Gucio wydaje odgłos: ...
Pies Burek wydaje odgłos: Hau!
Kot Mruczek wydaje odgłos: Miau!
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
1
kot Filemon
Oczekiwane wyjście
Kot Filemon wydaje odgłos: Miau!

Test 2

Nie uruchomiono
Wejście
1
zwierz Nemo
Oczekiwane wyjście
Zwierz Nemo wydaje odgłos: ...

Test 3

Nie uruchomiono
Wejście
4
pies Azor
pies Reksio
kot Tom
zwierz Gucio
Oczekiwane wyjście
Pies Azor wydaje odgłos: Hau!
Pies Reksio wydaje odgłos: Hau!
Kot Tom wydaje odgłos: Miau!
Zwierz Gucio wydaje odgłos: ...

Test 4

Nie uruchomiono
Wejście
3
kot Bonifacy
pies Szarik
kot Garfield
Oczekiwane wyjście
Kot Bonifacy wydaje odgłos: Miau!
Pies Szarik wydaje odgłos: Hau!
Kot Garfield wydaje odgłos: Miau!
Uruchom z własnymi danymi