W języku Python programowanie zorientowane obiektowoprogramowanie zorientowane obiektowoprogramowanie zorientowane obiektowo jest opcjonalne. Pozwala ono efektywnie zarządzać kodem programu.

Obiekt, w potocznym rozumieniu, to najczęściej realna rzecz, osoba, zwierzę. Wyobraźmy sobie zatem psa. Ma kolor, wielkość, wagę. Potrafi szczekać, spać, jeść. Często uczymy go różnych komend: „podaj łapę”, „zostaw”, „aport”. Spróbujemy przenieść przykład psa w świat programowania.

Zaczniemy od utworzenia klasy, czyli od opisu ogólnego psa oraz jego możliwych zachowań. W języku Python zapisujemy to w następujący sposób:

Linia 1. class Pies dwukropek. Linia 2. pass.

W tej definicji możemy wyodrębnić:

  • słowo kluczowe class – oznacza definicję nowej klasy,

  • nazwę klasy Pies – według dokumentu PEP 8PEP 8PEP 8 nazwy klas zapisujemy wielką literą,

  • słowo kluczowe pass oznaczające instrukcję: nic nie robimy, jej wykonanie nie powoduje żadnych skutków; używamy go, gdy składnia wymaga instrukcji, a my nie chcemy, aby program cokolwiek wykonywał.

Przykład 1

Utworzymy obiekt klasy Pies o nazwie pierwszy_psiak. Za pomocą funkcji type() sprawdzimy, jakiego typu jest utworzony obiekt oraz jakie elementy zawiera.

Linia 1. class Pies dwukropek. Linia 2. pass. Linia 4. pierwszy podkreślnik psiak znak równości Pies otwórz nawias okrągły zamknij nawias okrągły. Linia 6. print otwórz nawias okrągły type otwórz nawias okrągły pierwszy podkreślnik psiak zamknij nawias okrągły zamknij nawias okrągły. Linia 7. kratka otwórz nawias ostrokątny class apostrof podkreślnik podkreślnik main podkreślnik podkreślnik kropka Pies apostrof zamknij nawias ostrokątny.

Typ obiektu pierwszy_psiak to klasa __main__.Pies.

Ważne!

Pola klasy mają tą samą wartość dla wszystkich obiektów takiej klasy, a pola obiektu – a więc instancji klasy – są unikalne dla każdego obiektu.

W następnym kroku stworzymy podstawowy opis psa. Dla tego obiektu będziemy chcieli zapamiętać następujące pola:

  • rasa psa,

  • imię psa.

Dla klasy Pies ustalimy pole typ o wartości czworonóg. Ponadto zdefiniujemy funkcję o nazwie: podaj_lape(), która będzie wypisywać na ekranie komunikat, korzystając z danych zawartych w klasie, oraz funkcję opis_zwierzaka() informującą o typie i rasie.

Zdefiniujmy podstawową klasę, używając wskazówek typówwskazówki typówwskazówek typów do wskazania typów danych. Pola obiektów inicjalizowane będą przez funkcję __init__(). Omówienie tej funkcji znajdziesz w e‑materiale Konstruktory i destruktory w języku PythonP6SDfh0EpKonstruktory i destruktory w języku Python

Linia 1. class Pies dwukropek. Linia 2. cudzysłów cudzysłów cudzysłów klasa opisująca psa cudzysłów cudzysłów cudzysłów. Linia 4. kratka zmienna klasowa współdzielona przez wszystkie instancje klasy. Linia 5. typ dwukropek str znak równości cudzysłów czworonóg cudzysłów. Linia 7. def podkreślnik podkreślnik init podkreślnik podkreślnik otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 8. self kropka imie dwukropek str znak równości cudzysłów cudzysłów. Linia 9. self kropka rasa dwukropek str znak równości cudzysłów cudzysłów. Linia 11. def podaj podkreślnik lape otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 12. print otwórz nawias okrągły f cudzysłów Zwierzak otwórz nawias klamrowy self kropka imie zamknij nawias klamrowy podaje łapę kropka cudzysłów zamknij nawias okrągły. Linia 14. def opis podkreślnik zwierzaka otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 15. print otwórz nawias okrągły f cudzysłów Zwierzak typu otwórz nawias klamrowy self kropka typ zamknij nawias klamrowy minus otwórz nawias klamrowy self kropka imie zamknij nawias klamrowy przecinek rasa dwukropek otwórz nawias klamrowy self kropka rasa zamknij nawias klamrowy cudzysłów zamknij nawias okrągły.
Ważne!

Bardzo ważnym elementem jest słowo kluczowe self – reprezentuje ono instancję klasy. Gdy go użyjemy, obiekt będzie wiedział, że odnosimy się do jego pola bądź metody.

Przykład 2

Przykładowe utworzenie obiektu klasy Pies:

Linia 1. pies znak równości Pies otwórz nawias okrągły zamknij nawias okrągły. Linia 3. kratka przypisujemy konkretne wartości do pól instancji klasy. Linia 4. pies kropka rasa znak równości apostrof kundelek apostrof. Linia 5. pies kropka imie znak równości apostrof Reksio apostrof.
Przykład 3

Możemy zdefiniować inne obiekty klasy Pies i przypisać ich polom różne wartości.

Linia 1. kratka definicja nowych obiektów klasy Pies. Linia 2. pies podkreślnik a znak równości Pies otwórz nawias okrągły zamknij nawias okrągły. Linia 3. pies podkreślnik a kropka rasa znak równości cudzysłów kundelek cudzysłów. Linia 4. pies podkreślnik a kropka imie znak równości cudzysłów Reksio cudzysłów. Linia 6. pies podkreślnik b znak równości Pies otwórz nawias okrągły zamknij nawias okrągły. Linia 7. pies podkreślnik b kropka rasa znak równości cudzysłów kundelek cudzysłów. Linia 8. pies podkreślnik b kropka imie znak równości cudzysłów Azor cudzysłów. Linia 10. pies podkreślnik c znak równości Pies otwórz nawias okrągły zamknij nawias okrągły. Linia 11. pies podkreślnik c kropka rasa znak równości cudzysłów wilczur cudzysłów. Linia 12. pies podkreślnik c kropka imie znak równości cudzysłów Brutus cudzysłów.

Każdy z obiektów klasy ma pola klasy o różnych wartościach, a metody podaj_lape() oraz opis_zwierzaka() działają dla każdego obiektu w następujący sposób, tj.  poszczególne obiekty w wyświetlanych komunikatach będą wykorzystywały swoje zmienne wewnętrzne, podane im wcześniej przy inicjalizacji obiektów.

Linia 1. pies podkreślnik a kropka opis podkreślnik zwierzaka otwórz nawias okrągły zamknij nawias okrągły. Linia 2. kratka Zwierzak typu czworonóg minus Reksio przecinek rasa dwukropek kundelek. Linia 3. pies podkreślnik a kropka podaj podkreślnik lape otwórz nawias okrągły zamknij nawias okrągły. Linia 4. kratka Zwierzak Reksio podaje łapę kropka. Linia 6. pies podkreślnik b kropka opis podkreślnik zwierzaka otwórz nawias okrągły zamknij nawias okrągły. Linia 7. kratka Zwierzak typu czworonóg minus Azor przecinek rasa dwukropek kundelek. Linia 8. pies podkreślnik b kropka podaj podkreślnik lape otwórz nawias okrągły zamknij nawias okrągły. Linia 9. kratka Zwierzak Azor podaje łapę kropka. Linia 11. pies podkreślnik c kropka opis podkreślnik zwierzaka otwórz nawias okrągły zamknij nawias okrągły. Linia 12. kratka Zwierzak typu czworonóg minus Brutus przecinek rasa dwukropek wilczur. Linia 13. pies podkreślnik c kropka podaj podkreślnik lape otwórz nawias okrągły zamknij nawias okrągły. Linia 14. kratka Zwierzak Brutus podaje łapę kropka.

Łatwo również wykazać, że obiekty klasy są różnymi obiektami. Python ma funkcję id(), pozwalającą pokazać unikatowy identyfikatoridentyfikatoridentyfikator zmiennej.

Linia 1. kratka przykładowe wyniki wywołania funkcji id otwórz nawias okrągły zamknij nawias okrągły. Linia 2. kratka jeśli spróbujesz wywołać kod samodzielnie przecinek. Linia 3. kratka najprawdopodbniej otrzymasz inne wyniki przecinek. Linia 4. kratka ponieważ Python przyporządkuje obiektom inne. Linia 5. kratka adresy w pamięci. Linia 6. print otwórz nawias okrągły id otwórz nawias okrągły pies podkreślnik a zamknij nawias okrągły zamknij nawias okrągły. Linia 7. kratka 140279558901432. Linia 9. print otwórz nawias okrągły id otwórz nawias okrągły pies podkreślnik b zamknij nawias okrągły zamknij nawias okrągły. Linia 10. kratka 140279558899752. Linia 12. print otwórz nawias okrągły id otwórz nawias okrągły pies podkreślnik c zamknij nawias okrągły zamknij nawias okrągły. Linia 13. kratka 140279558901712.
Ważne!

W programowaniu obiektowym dziedziczenie jest mechanizmem pozwalającym przekazać do klas, że cześć ich cech oraz metod jest zdefiniowana w innej klasie, a one same są potomkami tej klasy. Dzięki dziedziczeniu, tworząc nową klasę opisującą obiekty podobne do opisywanych przez klasę Pies, nie będziemy musieli ponownie definiować funkcji podaj_lape()opis_zwierzaka(), ani pola typ. Będą one automatycznie przeniesione do nowej klasy.

Przyjmijmy, że oprócz ogólnych obiektów typu Pies chcemy też opisywać specyficzne obiekty Hiena. Muszą one zawierać dodatkowe pola:

  • rasa: str – musi mieć zawsze wartość hiena,

  • rejon_występowania: str.

Przykład 4

Zdefiniujmy klasę Hiena, która będzie zawierała pola i funkcje klasy Pies wzbogacone o pewien nowy element. Pozwoli ona na przechowywanie informacji specyficznych dla hieny, przy czym niektóre elementy będą wspólne – dokładnie te, które klasa Hiena odziedziczyła po klasie Pies.

Linia 1. class Hiena otwórz nawias okrągły Pies zamknij nawias okrągły dwukropek. Linia 2. cudzysłów cudzysłów cudzysłów klasa opisująca hienę minus bazuje na klasie Pies cudzysłów cudzysłów cudzysłów. Linia 3. kratka przypisujemy wszystkim instancjom klasy Hiena wartość zmiennej klasowej rasa. Linia 5. def podkreślnik podkreślnik init podkreślnik podkreślnik otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 6. self kropka imie dwukropek str znak równości cudzysłów cudzysłów. Linia 7. self kropka rasa dwukropek str znak równości cudzysłów hiena cudzysłów. Linia 8. self kropka rejon podkreślnik wystepowania dwukropek str znak równości cudzysłów cudzysłów. Linia 10. kratka nadpisujemy metodę przecinek aby wyswietlała też rejon występowania. Linia 11. def opis podkreślnik zwierzaka otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 12. print otwórz nawias okrągły f cudzysłów Zwierzak typu otwórz nawias klamrowy self kropka typ zamknij nawias klamrowy minus otwórz nawias klamrowy self kropka imie zamknij nawias klamrowy przecinek rasa dwukropek otwórz nawias klamrowy self kropka rasa zamknij nawias klamrowy przecinek rejon wystepowania dwukropek otwórz nawias klamrowy self kropka rejon podkreślnik wystepowania zamknij nawias klamrowy cudzysłów zamknij nawias okrągły.

Możemy zdefiniować kilka obiektów i sprawdzić, jak działają ich metody.

Linia 1. kratka definicja nowych obiektów klasy Hiena. Linia 2. hiena podkreślnik a znak równości Hiena otwórz nawias okrągły zamknij nawias okrągły. Linia 3. hiena podkreślnik a kropka imie znak równości cudzysłów Kunegunda cudzysłów. Linia 4. hiena podkreślnik a kropka rejon podkreślnik wystepowania znak równości cudzysłów Polska cudzysłów. Linia 6. hiena podkreślnik b znak równości Hiena otwórz nawias okrągły zamknij nawias okrągły. Linia 7. hiena podkreślnik b kropka imie znak równości cudzysłów Topaz cudzysłów. Linia 8. hiena podkreślnik b kropka rejon podkreślnik wystepowania znak równości cudzysłów Hiszpania cudzysłów. Linia 10. kratka próba wywołania metod zdefiniowanych w klasie Pies. Linia 11. hiena podkreślnik a kropka opis podkreślnik zwierzaka otwórz nawias okrągły zamknij nawias okrągły. Linia 12. kratka Zwierzak typu czworonóg minus Kunegunda przecinek rasa dwukropek hiena przecinek rejon wystepowania dwukropek Polska. Linia 13. hiena podkreślnik a kropka podaj podkreślnik lape otwórz nawias okrągły zamknij nawias okrągły. Linia 14. kratka Zwierzak Kunegunda podaje łapę kropka. Linia 16. hiena podkreślnik b kropka opis podkreślnik zwierzaka otwórz nawias okrągły zamknij nawias okrągły. Linia 17. kratka Zwierzak typu czworonóg minus Topaz przecinek rasa dwukropek hiena przecinek rejon wystepowania dwukropek Hiszpania. Linia 18. hiena podkreślnik b kropka podaj podkreślnik lape otwórz nawias okrągły zamknij nawias okrągły. Linia 19. kratka Zwierzak Topaz podaje łapę kropka.
Ważne!

Metoda podaj_lape() nie była jawnie deklarowana w klasie Hiena. Została odziedziczona z klasy Pies.

1
Polecenie 1

Spróbuj zdefiniować klasę o nazwie Uczen, która będzie miała następujące pola instancji klasy, inicjalizowane przez funkcję __init__(). Omówienie tej funkcji znajdziesz w e‑materiale Konstruktory i destruktory w języku PythonP6SDfh0EpKonstruktory i destruktory w języku Python:

  • imię – łańcuch znaków,

  • nazwisko – łańcuch znaków,

  • email – łańcuch znaków,

  • oceny z informatyki – lista,

  • oceny z plastyki – lista,

  • oceny z języka polskiego – lista.

Dla zainteresowanych

Pola klasy (nie mylić z polami instancji klasy) powinny być niezmienne (immmutable)niezmiennaniezmienne (immmutable). Użycie typów zmiennych (mutable)zmiennazmiennych (mutable) może spowodować nieoczekiwane działanie obiektów klas. Oto definicja klasy ze zmiennymi i niezmiennymi polami:

Linia 1. class Samochod dwukropek. Linia 2. kratka Produkujemy tylko samochody jednej marki i nie potrzebujemy jej modyfikować. Linia 3. marka dwukropek str znak równości cudzysłów Polonez cudzysłów. Linia 5. kratka Niepoprawne zdefiniowanie pola klasy przecinek ponieważ lista jest zmienna otwórz nawias okrągły mutable zamknij nawias okrągły przecinek. Linia 6. kratka każda instancja klasy będzie mogła ją modyfikować. Linia 7. wyposazenie dwukropek list znak równości otwórz nawias kwadratowy cudzysłów Kierownica cudzysłów przecinek cudzysłów Lusterka cudzysłów przecinek cudzysłów Radio cudzysłów zamknij nawias kwadratowy. Linia 9. kratka W takim przypadku lepiej by było użyć krotki przecinek która jest niezmienna otwórz nawias okrągły immutable zamknij nawias okrągły. Linia 10. wyposazenie dwukropek tuple znak równości otwórz nawias okrągły cudzysłów Kierownica cudzysłów przecinek cudzysłów Lusterka cudzysłów przecinek cudzysłów Radio cudzysłów zamknij nawias okrągły.
Już wiesz
  • W języku Python wszystko jest obiektem.

  • Klasy w języku Python mogą dziedziczyć pola klasy oraz metody po swojej klasie bazowej, jeżeli jest taka podana w definicji klasy.

  • Programowanie obiektowe pozwala efektywnie zarządzać kodem programu.

  • Obiekt to konkretny element klasy.

  • Każdy obiekt zawiera wszystkie pola klasy i jej metody.

Słownik

identyfikator
identyfikator

(ang. identity) – liczba naturalna, która jest unikatowa i stała dla każdego obiektu w  przestrzeni nazw języka Python w trakcie swojego istnienia; w implementacji CPython jest to adres pamięci RAM, w którym przechowywany jest obiekt

klasa
klasa

opis (definicja) tworzonych na jej podstawie obiektów; składa się z pól i metod; pola (atrybuty) przechowują wartości, które są cechami obiektu, z kolei metody pozwalają na manipulacje tymi wartościami

niezmienna
niezmienna

(ang. immutable) sekwencja, która jest niemodyfikowalna „w miejscu”, a więc nie można zmienić żadnego z jej elementów wewnątrz, trzeba stworzyć nowy obiekt, który zawiera zmienione elementy; w języku Python większość wbudowanych typów jest niezmienna, np. liczby, krotki, łańcuch znaków

obiekt
obiekt

instancja klasy; powstaje w wyniku utworzenia zmiennej typu obiektowego (danej klasy); obiekt jest zbudowany z pól zadeklarowanych w klasie; do zmian wartości pól możemy wykorzystać zaimplementowane w klasie metody; obiekty możemy jednoznacznie identyfikować

PEP 8
PEP 8

Style Guide for Python Code – dokument stworzony przez Guido van Rossum, opisujący konwencje kodowania dla języka Python, które powinny stanowić drogowskaz dla programistów

programowanie zorientowane obiektowo
programowanie zorientowane obiektowo

(ang. OOP – Object Oriented Programming) – paradygmat programowania; konwencja wytwarzania oprogramowania, zalecająca traktowanie programu komputerowego jako współpracujących ze sobą abstrakcyjnych obiektów, posiadających pola/atrybuty (określające stan) oraz metody (definiujące zachowania); obiekty stworzone według klas współpracują ze sobą w celu wykonywania zadań

wskazówki typów
wskazówki typów

(ang. type hints) informacja o typie danego obiektu zapisana literalnie w kodzie programu (te podpowiedzi w żaden sposób nie wpływają na działanie programu; z uwagi na dynamiczną naturę języka Python), pomaga ona w zrozumieniu kodu programu i pozwala na sprawdzanie kodu przez różne programy IDE, np. PyCharm czy SublimeText lub Atom; przykład użycia takiego zapisu: zmienna: int = 10; type hints są dokładnie opisane w dokumencie PEP 484, inną nazwą są annotations opisane w dokumencie PEP 3107

zmienna
zmienna

(ang. mutable) sekwencja, która jest modyfikowalna „w miejscu”, a więc można zmienić dowolny z jej elementów wewnątrz, bez konieczności przypisywania nowych wartości do kolejnego obiektu; w języku Python zmienne są np. listy, słowniki, zbiory