Zliczanie instancji klasy

Zadanie 7 z 11 · rozdział 18Trudność: 1 z 3classstatic

Treść zadania

Zaprojektuj klasę MojaKlasa, która sama zlicza, ile jej obiektów (instancji) utworzono:

  • atrybut klasy (wspólny dla wszystkich obiektów) _licznik, początkowo równy 0 — podkreślenie na początku nazwy oznacza, że jest to pole „prywatne”, którego nie należy zmieniać spoza klasy,
  • konstruktor zwiększa licznik o 1 i zapisuje w atrybucie obiektu numer numer nowego obiektu (pierwszy utworzony obiekt ma numer 1),
  • metoda statyczna liczba_instancji() zwraca liczbę dotychczas utworzonych obiektów.

Program wykonuje polecenia:

  • nowy — tworzy nowy obiekt MojaKlasa i wypisuje Utworzono obiekt nr <numer>.
  • ile — wypisuje Liczba utworzonych instancji: <liczba>

Dane wejściowe

  • 1. linia: liczba poleceń $n$
  • kolejne $n$ linii: polecenie nowy albo ile

Dane wyjściowe

Po jednej linii dla każdego polecenia, w formacie opisanym w treści.

Ograniczenia

  • $1 \le n \le 100$

Uwagi

  • Do atrybutu klasy odwołuj się przez nazwę klasy: MojaKlasa._licznik. Zapis self._licznik += 1 utworzyłby osobny atrybut w każdym obiekcie i licznik nie byłby wspólny.

Przykład

Wejście
5
nowy
nowy
ile
nowy
ile
Wyjście
Utworzono obiekt nr 1.
Utworzono obiekt nr 2.
Liczba utworzonych instancji: 2
Utworzono obiekt nr 3.
Liczba utworzonych instancji: 3
Zasady obowiązujące w rozdziale 18

Zadania w tym rozdziale uczą projektowania klas: konstruktora __init__, atrybutów, metod, metod statycznych (@staticmethod) oraz metod specjalnych, dzięki którym obiekty można wypisywać (__str__), porównywać (__eq__) i łączyć operatorami (__add__, __sub__, __mul__, …). Ostatnie zadania wprowadzają też wyjątki (raise, try/except), klasy danych (@dataclass) i generatory (yield).

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 szkieletem klasy, a zwykle także z gotowym wczytywaniem danych i wypisywaniem wyników. Twoim zadaniem jest przede wszystkim uzupełnienie metod klasy — wynik programu zależy od tego, jak działa Twoja klasa.
  • 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, Prostokat.
  • „Z dokładnością do 2 miejsc po przecinku” oznacza dokładnie dwie cyfry po kropce, np. f"{x:.2f}" (3.00, -0.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
ile
Oczekiwane wyjście
Liczba utworzonych instancji: 0

Test 2

Nie uruchomiono
Wejście
1
nowy
Oczekiwane wyjście
Utworzono obiekt nr 1.

Test 3

Nie uruchomiono
Wejście
4
nowy
nowy
nowy
ile
Oczekiwane wyjście
Utworzono obiekt nr 1.
Utworzono obiekt nr 2.
Utworzono obiekt nr 3.
Liczba utworzonych instancji: 3

Test 4

Nie uruchomiono
Wejście
6
ile
nowy
ile
nowy
nowy
ile
Oczekiwane wyjście
Liczba utworzonych instancji: 0
Utworzono obiekt nr 1.
Liczba utworzonych instancji: 1
Utworzono obiekt nr 2.
Utworzono obiekt nr 3.
Liczba utworzonych instancji: 3

Test 5

Nie uruchomiono
Wejście
3
nowy
ile
ile
Oczekiwane wyjście
Utworzono obiekt nr 1.
Liczba utworzonych instancji: 1
Liczba utworzonych instancji: 1
Uruchom z własnymi danymi