Jason. Cała informatyka w jednym miejscu!

Wspinamy się coraz wyżej z Pythonem! Język ten jest ceniony również z powodu możliwości pisania w jednym z kilku paradygmatów programowania. Zatem klasy i obiekty w Pythonie są jak najbardziej na miejscu, przy czym to nie jest jedyne rozwiązanie. Będziecie następnymi osobami, które poznają drogę do pisania w paradygmacie obiektowym. Zapraszam serdecznie!

KLASY I OBIEKTY W PYTHONIE W PIGUŁCE

Nie będę wchodził w obszerne treści teoretyczne, skupimy się tylko na części kodowej i tylko na tej obowiązującej w Pythonie. Wspomnę tylko o najistotniejszych rzeczach.

ISTOTA PARADYGMATU OBIEKTOWEGO

Paradygmat obiektowy to podział oprogramowania na obiekty, które mają się ze sobą "komunikować". Obiekty te charakteryzują się posiadaniem własnych zmiennych (poprawna nazwa brzmi "dane składowe") określających ich stan, a także funkcjami (nazywanymi prawidłowo "metodami") określającymi zachowanie. To pozwala na uszeregowanie poszczególnych danych i metod wstawiając je tam, gdzie dotyczą one konkretnego bytu (nie są one "porozwalane" po całym programie :)), a także pozwala odejść od praktyki stosowania zmiennych globalnych, które w programowaniu obiektowym są traktowane jak zło. Kolejną zaletą jest fakt, iż paradygmat obiektowy jest bardzo zbliżony do naszego "patrzenia" zgodnego z rzeczywistością, dlatego jest tak chętnie używany przez wiele osób.

Na koniec części teoretycznej, różnica pomiędzy klasą, a obiektem. Klasa to szablon/wzorzec dla obiektu, obiekt to kopia klasy (nazywana też "instancją").

TWORZENIE WŁASNEJ KLASY

Słowem kluczowym pozwalającym na tworzenie klasy jest "class", zresztą nic się nie zmienia w porównaniu do Javy czy C#. W celu utworzenia własnej klasy w kodzie źródłowym, korzystamy z wymienionego słowa, podajemy nazwę i znowu kończymy dwukropkiem!

class MyClass:
    number = 0
    string = ""

Wcięcie (które jest obowiązkowe) określa zasięg dla nowo stworzonej klasy. Wewnątrz umieszczamy wszelkie dane składowe (czyli zmienne w klasie), a także funkcje, które staną się metodami (chociaż tutaj obowiązuje jedna reguła opisana dwa akapity dalej).

TWORZENIE INSTANCJI

Klasy i obiekty w Pythonie muszą występować razem, żeby był sens ich użycia. Jedno nie może istnieć bez drugiego, jeżeli ma być z tego użytek. Aby klasa znalazła swoją użyteczność, trzeba w oparciu o nią utworzyć obiekt. Tworzymy sobie w tym celu nową zmienną o dowolnej nazwie, a po znaku przypisania (znak równości) podajemy bezbłędnie nazwę klasy. Zaraz po niej dorzucamy parę nawiasów okrągłych, ponieważ klasa może przyjmować własne parametry. Na podanym przykładzie to może wyglądać następująco:

my_class = MyClass()

Klasa może bez żadnych przeciwskazań przyjmować parametry, tak jak metoda. To, jakie parametry i czy w ogóle dana klasa przyjmuje, zależy od listy parametrów metody "__init__" (dwa znaki podkreślenia z obu stron)! Nazywana jest zamiennie "konstruktorem", gdyż funkcjonuje tak samo jak konstruktor, zgodnie z terminologią programowania obiektowego.

METODY SAMOWYWOŁUJĄCE SIĘ

Klasy i obiekty w Pythonie wyróżniają się i pod tym względem pewnym szczegółem. Nagłówek może dziwnie brzmieć, ale nie chciałem tak z marszu pisać, że niektóre metody zachowują się jak tzw. "listenery". Ale istotnie, wspomniana metoda "__init__" zachowuje się jak "listener", ponieważ nie wywołujemy tej metody ręcznie, tylko wywołuje się automatycznie po utworzeniu każdego następnego obiektu!

Weźmy sobie na plan poprzednią klasę z dodaną metodą "__init__":

class MyClass:
    number = 0
    string = ""

    def __init__(self):
        # dowolne instrukcje

Dodanie dowolnej treści do "__init__" spowoduje wykonanie każdej instrukcji w jej bloku, natychmiast po utworzeniu instancji klasy.

Metoda "__init__" w klasie w Pythonie

Klasy i obiekty w Pythonie posiadają kilka wbudowanych metod wykonywanych automatycznie w wyniku jakichś zdarzeń np. utworzenia nowego obiektu na podstawie tej klasy.

Istnieje kilka różnych metod tego typu. Mogę za kolejny przykład podać parę metod "__enter__" oraz "__exit__", które wykonują się przy wejściu i wyjściu z instrukcji "with" opisywanej już wcześniej.

Metody "__enter__" oraz "__exit__" w klasie w Pythonie

Metody wykonujące się automatycznie, "__enter__" i "__exit__", są "odpalane" po wejściu i po wyjściu z instrukcji "with" przy użyciu tej samej klasy.

PARAMETR "SELF" W KAŻDEJ METODZIE

Widzicie parametr w każdej metodzie nazwany "self"? To nie jest moje widzimisię, to jest jedna z reguł przyjętego do wykonania programu. Prawidłowo zdefiniowaną metodę w klasie w Pythonie wyróżnia występujący w nawiasach parametr o nazwie "self". Oznacza on odnoszenie się do swoich danych składowych i metod stanowiąc referencję do samego siebie celem bezkarnego edytowania danych składowych i wywoływania innych metod z tej samej klasy. Aby uniknąć wystąpienia wyjątku, wstawienie "self" w każdą metodę jako pierwszy parametr jest KONIECZNE!

Wystąpienie wyjątku w metodzie "__init__" w klasie w Pythonie

Każda bez wyjątku metoda wymaga wstawienia parametru o nazwie "self" do listy parametrów formalnych, aby zapobiec zgłoszenia przez program wyjątku!

CZYM JEST ZMIENNA OBIEKTU?

Jeżeli chcecie programować w sposób świadomy, musicie mieć w głowie tę informację. W momencie utworzenia instancji klasy i przypisania wyniku do zmiennej, to jak myślicie, co konkretnie jest przypisywane do zmiennej? Albo inaczej: co zwraca funkcja "print" po podaniu zmiennej obiektu? Nie obstawiajcie na obiekt, bo to nie jest dobra odpowiedź.

Adres wskaźnika do obiektu klasy w Pythonie

Zmienna przechowująca obiekt, w rzeczywistości dysponuje adresem pamięci do tego obiektu. Za jego pomocą "przedostaje się" do właściwego miejsca w pamięci.

Dla Waszej wiadomości: każdy obiekt reprezentuje w rzeczywistości wskaźnik do tego obiektu. Ten wskaźnik z kolei przechowuje adres i za jego pomocą odnajduje bez problemu obiekt w pamięci. W ten sposób to działa. Nie tylko klasy i obiekty w Pythonie podlegają tej zasadzie. Tak jest w każdym języku obiektowym i wynika to z architektury. Aby naprawdę to zrozumieć, należy sięgnąć do informacji o stercie, strukturze danych przechowującej adresy do zmiennych obiektowych.

DOSTĘP DO DANYCH SKŁADOWYCH

Dwa słowa o modyfikowaniu danych składowych. Jak wspomniałem którymś razem, Python "bierze" dużo z języka C. Postępujemy tak jak przy strukturach i uniach. Za pomocą operatora kropki, dostajemy się bezkarnie do dowolnej danej składowej.

Odwoływanie się do danych składowych obiektu klasy w Pythonie

Operator kropki pozwala na przedostanie się do każdej danej składowej obiektu i na dowolną manipulację jej wartością.

DODATKOWE UWAGI

Na końcówkę, istotne uwagi. Python NIE JEST stricte "przedstawicielem" programowania obiektowego! Przykładowym dowodem jest to, że nie posiada w sobie możliwości określania modyfikatora dostępu dla danych składowych czy metod, tak jak może być Wam znane z języka Java lub C#. Można do wszystkiego odwołać się bezpośrednio po kropce, tak jak do struktur w języku C. Nie napisałem tego po to, aby Was zniechęcić pisaniem obiektowo w Pythonie. Chcę tylko żebyście się nie rozczarowali tym, że pewnych rzeczy tutaj nie znajdziecie, a występują one tylko w językach naprawdę "czysto obiektowych" :). Python nie jest "czysto obiektowym" językiem!


Tyle informacji już naprawdę wystarczy. Artykuł ten krótki nie wyszedł, więc tym bardziej mam nadzieję, że docenicie ten wysiłek. Klasy i obiekty w Pythonie to naprawdę szeroki temat wymagający przekazania sporej treści informacji.

PODOBNE ARTYKUŁY