Wiemy, jak zdefiniować klasę w języku Python (informacje na ten temat znajdziesz między innymi w e‑materiale Wstęp do programowania obiektowego w języku PythonPRNvQDc25Wstęp do programowania obiektowego w języku Python). Potrafimy też tworzyć obiekt odwołujący się do niej. Zbadamy teraz, w jaki sposób taki obiekt powstaje. Z tego e‑materiału dowiemy się również, jakie czynności są wykonywane podczas usuwania go z przestrzeni nazwprzestrzeń nazwprzestrzeni nazw.

Stwórzmy klasę, która będzie przechowywać dane pracowników firmy. Każdy obiekt powinien mieć następujące pola:

  • imię,

  • nazwisko,

  • płeć (kobieta/mężczyzna),

  • numer telefonu.

1
Przykład 1

Zdefiniujmy klasę Pracownik. Konstruktor tworzymy przy użyciu specjalnej funkcji dunderdunderdunder o nazwie __init__(). Dzięki niej utworzymy i zainicjalizujemy pola instancji klasy.

Linia 1. class Pracownik dwukropek. Linia 2. def podkreślnik podkreślnik init podkreślnik podkreślnik otwórz nawias okrągły self przecinek imie dwukropek str przecinek nazwisko dwukropek str przecinek plec dwukropek str przecinek telefon dwukropek int zamknij nawias okrągły dwukropek. Linia 3. self kropka imie znak równości imie. Linia 4. self kropka nazwisko znak równości nazwisko. Linia 5. self kropka plec znak równości plec. Linia 6. self kropka telefon znak równości telefon. Linia 8. def pokaz podkreślnik informacje otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 9. print otwórz nawias okrągły cudzysłów Pracownik dwukropek cudzysłów przecinek self kropka imie przecinek self kropka nazwisko przecinek cudzysłów przecinek płeć dwukropek cudzysłów przecinek self kropka plec przecinek cudzysłów przecinek numer telefonu dwukropek cudzysłów przecinek self kropka telefon zamknij nawias okrągły.
Ważne!

__init__() pełni rolę konstruktora – specjalnej funkcji dunder, która jest wykonywana podczas tworzenia obiektu. Może ona służyć do inicjowania pól powiązanych z danym obiektem oraz wykonywać inne dowolne operacje związane z nim lub z całą klasą.

Ważne!

Słowo kluczowe self – wskazuje na konkretny obiekt, który tworzymy.

1
Przykład 2

Utwórzmy obiekt klasy Pracownik, a następnie wywołajmy metodę pokaz_informacje().

Linia 1. michal znak równości Pracownik otwórz nawias okrągły cudzysłów Michał cudzysłów przecinek cudzysłów Adamczyk cudzysłów przecinek cudzysłów M cudzysłów przecinek 421236790 zamknij nawias okrągły. Linia 2. michal kropka pokaz podkreślnik informacje otwórz nawias okrągły zamknij nawias okrągły. Linia 3. kratka Pracownik dwukropek Michał Adamczyk przecinek płeć dwukropek M przecinek numer telefonu dwukropek 421236790.
1
Przykład 3

Do konstruktora dodamy nowe funkcjonalności. Możemy na przykład skorzystać z domyślnych argumentów. Gdy użytkownik nie wprowadzi płci do konstruktora, możemy domyślnie ustawić ją na "M", a w przypadku telefonu domyślą wartością może być None. Poza tym możemy sprawdzać, czy użytkownik podał poprawne dane. Przykładowo możemy nie pozwalać na ustawienie płci innej niż "M""K".

Linia 1. class Pracownik dwukropek. Linia 2. def podkreślnik podkreślnik init podkreślnik podkreślnik otwórz nawias okrągły self przecinek imie dwukropek str przecinek nazwisko dwukropek str przecinek plec dwukropek str znak równości cudzysłów M cudzysłów przecinek telefon dwukropek int znak równości None zamknij nawias okrągły dwukropek. Linia 3. self kropka imie znak równości imie. Linia 4. self kropka nazwisko znak równości nazwisko. Linia 5. kratka sprawdzamy poprawność płci. Linia 6. if plec wykrzyknik znak równości cudzysłów K cudzysłów and plec wykrzyknik znak równości cudzysłów M cudzysłów dwukropek. Linia 7. print otwórz nawias okrągły cudzysłów Niepoprawny format płci wykrzyknik cudzysłów zamknij nawias okrągły. Linia 8. self kropka plec znak równości cudzysłów M cudzysłów. Linia 9. else dwukropek. Linia 10. self kropka plec znak równości plec. Linia 11. kratka sprawdzamy poprawność numeru telefonu. Linia 12. if otwórz nawias okrągły len otwórz nawias okrągły str otwórz nawias okrągły telefon zamknij nawias okrągły zamknij nawias okrągły wykrzyknik znak równości 9 or type otwórz nawias okrągły telefon zamknij nawias okrągły wykrzyknik znak równości int zamknij nawias okrągły and telefon is not None dwukropek. Linia 13. print otwórz nawias okrągły cudzysłów Niepoprawny format telefonu wykrzyknik cudzysłów zamknij nawias okrągły. Linia 14. self kropka telefon znak równości None. Linia 15. else dwukropek. Linia 16. self kropka telefon znak równości telefon. Linia 18. def pokaz podkreślnik informacje otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 19. print otwórz nawias okrągły cudzysłów Pracownik dwukropek cudzysłów przecinek self kropka imie przecinek self kropka nazwisko przecinek cudzysłów przecinek płeć dwukropek cudzysłów przecinek self kropka plec przecinek cudzysłów przecinek numer telefonu dwukropek cudzysłów przecinek self kropka telefon zamknij nawias okrągły.

Przetestujmy, jak działa nowy konstruktor:

Linia 1. adam znak równości Pracownik otwórz nawias okrągły cudzysłów Adam cudzysłów przecinek cudzysłów Woźniak cudzysłów zamknij nawias okrągły. Linia 2. adam kropka pokaz podkreślnik informacje otwórz nawias okrągły zamknij nawias okrągły. Linia 3. kratka Pracownik dwukropek Adam Woźniak przecinek płeć dwukropek M przecinek numer telefonu dwukropek None. Linia 5. agata znak równości Pracownik otwórz nawias okrągły cudzysłów Agata cudzysłów przecinek cudzysłów Lewandowska cudzysłów przecinek cudzysłów kobieta cudzysłów przecinek 123 zamknij nawias okrągły. Linia 6. kratka Niepoprawny format płci wykrzyknik. Linia 7. kratka Niepoprawny format telefonu wykrzyknik. Linia 8. agata kropka pokaz podkreślnik informacje otwórz nawias okrągły zamknij nawias okrągły. Linia 9. kratka Pracownik dwukropek Agata Lewandowska przecinek płeć dwukropek M przecinek numer telefonu dwukropek None.

Ważne!

Jeśli potrzebujemy informacji o skasowaniu obiektu (np. chcemy utworzyć dziennik z odpowiednimi informacjami), mamy do dyspozycji specjalną metodę dunder o nazwie __del__(). Jest to tzw. destruktor. Zostaje on wykonany w momencie, w którym obiekt danej klasy przestaje istnieć (jest usuwany z pamięci).

1
Przykład 4

Rozszerzymy klasę Pracownik o nowe funkcjonalności. Zdefiniujmy w niej słownik przechowujący liczbę osób aktualnie pracujących w firmie. Wywołanie konstruktora tej klasy oznacza wzrost liczby pracowników (np. zatrudnienie nowego pracownika), co powoduje konieczność wzrostu liczby pracowników przechowywanej w stworzonym wcześniej słowniku. Uzyskamy to poprzez inkrementację tej wartości w konstruktorze klasy pod koniec inicjalizacji obiektu (w kodzie przedstawionym poniżej jest za to odpowiedzialna linijka 21). Wywołanie destruktora oznacza działanie przeciwne do konstruktora, czyli spadek liczby pracowników (np. zwolnienie pracownika), co też powoduje konieczność zmiany przechowywanej wartości. W definicji destruktora zawrzemy fragment kodu, który będzie odpowiedzialny za dekrementację przechowywanej w słowniku liczby pracowników. Tworzony przez nas destruktor, oprócz zmniejszenia wartości zmiennej symbolizującej liczbę pracowników (w kodzie poniżej jest za to odpowiedzialna linijka 26), powinien również wyświetlić komunikat, jaki obiekt jest usuwany. Oprócz konstruktora i destruktora dodamy również funkcję wypisującą na standardowe wyjście aktualną liczbę pracowników, funkcję tę wykorzystamy również  w destruktorze do wyświetlenia zmodyfikowanego stanu zmiennej.

Linia 1. class Pracownik dwukropek. Linia 2. kratka Tworzymy słownik do przechowywania liczby pracowników. Linia 3. slownik znak równości otwórz nawias klamrowy cudzysłów liczba pracownikow cudzysłów dwukropek 0 zamknij nawias klamrowy. Linia 5. def podkreślnik podkreślnik init podkreślnik podkreślnik otwórz nawias okrągły self przecinek imie dwukropek str przecinek nazwisko dwukropek str przecinek plec dwukropek str znak równości cudzysłów M cudzysłów przecinek telefon dwukropek int znak równości None zamknij nawias okrągły dwukropek. Linia 6. self kropka imie znak równości imie. Linia 7. self kropka nazwisko znak równości nazwisko. Linia 8. kratka sprawdzamy poprawność płci. Linia 9. if plec wykrzyknik znak równości cudzysłów K cudzysłów and plec wykrzyknik znak równości cudzysłów M cudzysłów dwukropek. Linia 10. print otwórz nawias okrągły cudzysłów Niepoprawny format płci wykrzyknik cudzysłów zamknij nawias okrągły. Linia 11. self kropka plec znak równości cudzysłów M cudzysłów. Linia 12. else dwukropek. Linia 13. self kropka plec znak równości plec. Linia 14. kratka sprawdzamy poprawność numeru telefonu. Linia 15. if otwórz nawias okrągły len otwórz nawias okrągły str otwórz nawias okrągły telefon zamknij nawias okrągły zamknij nawias okrągły wykrzyknik znak równości 9 or type otwórz nawias okrągły telefon zamknij nawias okrągły wykrzyknik znak równości int zamknij nawias okrągły and telefon is not None dwukropek. Linia 16. print otwórz nawias okrągły cudzysłów Niepoprawny format telefonu wykrzyknik cudzysłów zamknij nawias okrągły. Linia 17. self kropka telefon znak równości None. Linia 18. else dwukropek. Linia 19. self kropka telefon znak równości telefon. Linia 20. kratka Tworzymy nowego pracownika przecinek więc zwiększamy ich liczbę o 1. Linia 21. self kropka slownik otwórz nawias kwadratowy cudzysłów liczba pracownikow cudzysłów zamknij nawias kwadratowy plus znak równości 1. Linia 23. def podkreślnik podkreślnik del podkreślnik podkreślnik otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 24. print otwórz nawias okrągły cudzysłów Usunięto pracownika cudzysłów przecinek self kropka imie przecinek self kropka nazwisko zamknij nawias okrągły. Linia 25. kratka Usuwamy pracownika przecinek więc musimy zmniejszyć ich liczbę o 1. Linia 26. self kropka slownik otwórz nawias kwadratowy cudzysłów liczba pracownikow cudzysłów zamknij nawias kwadratowy minus znak równości 1. Linia 27. kratka wypisujemy liczbę pracowników po dekrementacji. Linia 28. self kropka liczba podkreślnik pracownikow otwórz nawias okrągły zamknij nawias okrągły. Linia 30. def pokaz podkreślnik informacje otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 31. print otwórz nawias okrągły cudzysłów Pracownik dwukropek cudzysłów przecinek self kropka imie przecinek self kropka nazwisko przecinek cudzysłów przecinek płeć dwukropek cudzysłów przecinek self kropka plec przecinek cudzysłów przecinek numer telefonu dwukropek cudzysłów przecinek self kropka telefon zamknij nawias okrągły. Linia 33. kratka Pobieramy ze słownika liczbę pracowników i wypysujemy ją na standardowe wyjście. Linia 34. def liczba podkreślnik pracownikow otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 35. pracownicy znak równości self kropka slownik kropka get otwórz nawias okrągły cudzysłów liczba pracownikow cudzysłów zamknij nawias okrągły. Linia 36. print otwórz nawias okrągły cudzysłów Aktualna liczba pracowników dwukropek cudzysłów przecinek pracownicy zamknij nawias okrągły.

Przetestujemy teraz, jak działa licznik osób w firmie, a także usuwanie obiektów pracowników, wykorzystując funkcję del().

Linia 1. kratka Metodę liczba podkreślnik pracownikow otwórz nawias okrągły zamknij nawias okrągły możemy wywołać dla klasy przecinek jeśli użyjemy jej także jako wartości parametru cudzysłów self cudzysłów. Linia 2. Pracownik kropka liczba podkreślnik pracownikow otwórz nawias okrągły Pracownik zamknij nawias okrągły. Linia 3. adam znak równości Pracownik otwórz nawias okrągły cudzysłów Adam cudzysłów przecinek cudzysłów Woźniak cudzysłów zamknij nawias okrągły. Linia 4. Pracownik kropka liczba podkreślnik pracownikow otwórz nawias okrągły Pracownik zamknij nawias okrągły. Linia 5. agata znak równości Pracownik otwórz nawias okrągły cudzysłów Agata cudzysłów przecinek cudzysłów Lewandowska cudzysłów przecinek cudzysłów K cudzysłów przecinek 123456789 zamknij nawias okrągły. Linia 6. agata kropka liczba podkreślnik pracownikow otwórz nawias okrągły zamknij nawias okrągły. Linia 7. michal znak równości Pracownik otwórz nawias okrągły cudzysłów Michał cudzysłów przecinek cudzysłów Adamczyk cudzysłów przecinek cudzysłów M cudzysłów przecinek 421236790 zamknij nawias okrągły. Linia 9. kratka Metodę liczba podkreślnik pracownikow otwórz nawias okrągły zamknij nawias okrągły możemy wywołać na dowolnym obiekcie tej klasy i otrzymamy dobry wynik. Linia 10. agata kropka liczba podkreślnik pracownikow otwórz nawias okrągły zamknij nawias okrągły. Linia 12. kratka Usuwamy obiekt. Linia 13. del otwórz nawias okrągły michal zamknij nawias okrągły.

Wynik działania programu:

Linia 1. Aktualna liczba pracowników dwukropek 0. Linia 2. Aktualna liczba pracowników dwukropek 1. Linia 3. Aktualna liczba pracowników dwukropek 2. Linia 4. Aktualna liczba pracowników dwukropek 3. Linia 5. Usunięto pracownika Michał Adamczyk. Linia 6. Aktualna liczba pracowników dwukropek 2.

Jeżeli po uruchomieniu powyższego kodu, pozwolimy mu zakończyć działanie bez przerywania (np. punktami przerwań w trybie debug kompilatora), zauważymy, że na standardowym wyjściu oprócz oczekiwanych komunikatów pojawią się również następujące:

Ważne!

Wystąpienie wspomnianego wcześniej komunikatu zależy od używanego interpretera. W przypadku używania interpretera IDLE komunikat się nie pojawi, jednak jeśli używasz interpretera PyCharm – tak.

Linia 1. kratka Usunięto pracownika Adam Woźniak. Linia 2. kratka Aktualna liczba pracowników dwukropek 1. Linia 3. kratka Usunięto pracownika Agata Lewandowska. Linia 4. kratka Aktualna liczba pracowników dwukropek 0.

Jest to spowodowane faktem, że pod koniec wykonywania skryptu wciąż istniejące obiekty wychodzą z zasięgu, co powoduje, że ich destruktory zostają wywołane podczas działania odśmiecaczaodśmiecaczodśmiecacza.


Ważne!
  • Bez jawnie zdefiniowanego konstruktora obiekt zostanie utworzony za pomocą konstruktora domyślnego stosowanego w takich sytuacjach przez język Python do tworzenia obiektów. Konstruktor taki nie robi z obiektem nic, poza umożliwieniem jego stworzenia (nie zmienia jego zmiennych wewnętrznych i nie wywołuje metod).

  • Bez jawnie zdefiniowanego destruktora język Python zastosuje do obsługi danego obiektu destruktor domyślny, który wykona jedynie podstawowe zadania destruktora.

  • Konstruktor i destruktor mogą zawierać kod odnoszący się do elementów konkretnego obiektu oraz do współdzielonych elementów klasy.

Już wiesz
  • Konstruktora używamy, aby zainicjować pola nowego obiektu klasy.

  • Konstruktor może zawierać dowolny blok kodu.

  • Destruktora używamy, jeśli chcemy wykonać blok kodu w momencie usuwania obiektu z pamięci.

Słownik

dunder
dunder

(ang. double under) funkcja, metoda lub pole specjalnego przeznaczenia w języku Python

odśmiecacz
odśmiecacz

(ang. garbage collector) aplikacja odpowiadająca za automatyczne czyszczenie pamięci, gdy znajdują się w niej niepotrzebne już dane

przestrzeń nazw
przestrzeń nazw

(ang. namespace) pakiet nazw zmiennych wraz z ich wartościami, przechowywanych w postaci słownika dict; przestrzenie nazw są przypisane m.in. do funkcji, modułów, klas