Rozpoczynamy następny artykuł z nauki Pythona 🐍! Sięgniemy dzisiaj do zagadnienia programowania obiektowego i przejdziemy wspólnie przez temat klas 🔥! Opiszę Ci czym w języku Python jest klasa, jak ją utworzyć i jak z niej korzystać, aby pisać jeszcze bardziej złożone programy za pomocą obiektów 🏆! Zapraszam 😉!

OTO CZYM JEST KLASA W JĘZYKU PYTHON!

Tak naprawdę, to dotkniemy dwóch terminów zamiast jednego: klasa i obiekt 😮. Oba są ze sobą spokrewnione, dlatego też trzeba dobrze rozumieć zarówno jedno pojęcie, jak i drugie 🧠. Potem przejdziemy do ukazania tworzenia klasy, dodawania do niej atrybutów (zmiennych) i metod (funkcji), a następnie jak tworzyć obiekty za jej pomocą i jak należy z nich korzystać 😄!

CZYM JEST KLASA W JĘZYKU PYTHON?

W Pythonie, klasa jest szablonem dla obiektów 📦. Jest to kluczowy element mający związek z paradygmatem obiektowym (ang. Object-Oriented Programming) w szeroko pojętym programowaniu, a zatem dotyczy to każdego języka wspierającego paradygmat obiektowy 💥!

Paradygmat to metoda "ułożenia" kodu źródłowego na pewien charakterystyczny sposób (więcej informacji znajdziesz w załączonym artykule ℹ️). W przypadku obiektowości, program jest dzielony na klasy i obiekty ✅. Oznacza to to, że do budowania "części" programu tworzysz dla nich klasy, z których później powstają obiekty komunikujące się między sobą 🌐. To chętnie stosowany sposób pisania programów, ponieważ jest bardzo zbliżony do naszego "patrzenia" zgodnego z rzeczywistością i łatwy w rozumieniu 👍.

Klasę możesz też rozumieć jako swój własny typ danych 🙂. Gdy tworzysz nową klasę, to funkcjonuje ona jako nowy typ danych, z którego możesz tworzyć zmienne typu "ta klasa" ❤️! Co więcej, możesz do niej wstawić metody, takie jakie mają niektóre wbudowane typy danych (na przykład łańcuch znaków 👍), które pozwalają na wykonywanie operacji bezpośrednio na wartości/zmiennej 😊.

Tak wygląda proste wytłumaczenie klas, a teraz wyjaśnię czym jest obiekt 💡!

CZYM JEST OBIEKT W JĘZYKU PYTHON?

Obiekt w języku Python odnosi się do klas w programowaniu obiektowym i oznacza w skrócie kopię klasy albo instancję klasy ℹ️. Chodzi o stworzenie pojedynczego egzemplarza na podstawie klasy, która jest szablonem dla powstających obiektów i działa jak "fabryka" 🏭. Obiekty można przypisywać do zmiennych czy parametrów innych funkcji, tak samo jak każdy inny typ danych ✅.

To wszystko odnośnie obu wspomnianych pojęć, więc możemy przejść do ukazania jak tworzymy klasy w kodzie 🔨!

JAK STWORZYĆ KLASĘ W JĘZYKU PYTHON?

Klasę w Pythonie tworzymy korzystając z następującej konstrukcji 👇:

class [nazwa klasy]:
	[atrybuty i/lub metody]

Na razie bez szczegółów odnośnie wstawiania atrybutów i metod (o tym będzie za chwilę) 🙂. Wyjaśniam samą postać, która składa się z takich elementów 👇:

  1. słowo kluczowe "class",
  2. nazwa klasy, po której będziemy mogli ją identyfikować w dalszej części kodu (w dalszej części opisuję zasady ℹ️),
  3. znak dwukropka (obowiązkowa rzecz, bez której będzie błąd składniowy 🚫),
  4. atrybuty i/lub metody po zrobieniu obowiązkowego wcięcia (poprzez spację lub tabulator), które mają występować w każdym obiekcie powstałym z tej klasy.

A teraz szczegóły 📣!

Klasa w języku Python zawsze zaczyna się od hasła "class". Tak jak dla instrukcji warunkowej jest "if", dla funkcji "def", tak dla klas jest "class" 😊. Następnie piszemy nazwę klasy i tu nazewnictwo wygląda zupełnie inaczej, niż było przy zmiennych i funkcjach, także zaraz sobie wyjaśnimy tę kwestię 🔥.

Gdy podamy nazwę klasy, wstawiamy ten sam obowiązkowy dwukropek jako oznaczenie bloku kodu, bez którego zrobi nam się błąd składniowy 🚫. Potem przechodzimy do kolejnego wiersza koniecznie poprzedzając go wcięciem (może być spacją albo tabulatorem) i od tego miejsca wstawiamy instrukcje dotyczące klasy ✔️. Natomiast nie piszemy ich tak jak zwykle w postaci ciągów instrukcji, tylko musi przyjąć pewną zorganizowaną formułę 💥!

JAKĄ POSTAĆ PRZYJMUJE KLASA W JĘZYKU PYTHON?

Tworząc klasę w Pythonie, jej zawartość musi być ułożona z podziałem na 2 części 👇:

  1. atrybuty (zmienne),
  2. metody (funkcje).

Jeżeli zmienne znajdują się w klasie, to określamy je wtedy "atrybutami". Tak samo jest z funkcjami - wtedy są nazywane "metodami". Natomiast nie jest obowiązkowe dodawanie do klasy ani atrybutów, ani metod ℹ️. Mówi się, że atrybuty określają stan obiektu, a metody, jego zachowanie.

Atrybuty zawsze są umieszczane jako pierwsze, na samej górze 1️⃣. Piszemy je dokładnie tak samo, jak zmienne "na zewnątrz". Po prostu wstawiamy nazwę, operator przypisania i wartość początkową jaką będzie przyjmować każdy obiekt tej klasy 👇:

class MyClass:
	my_attribute = 10

Metody jest zwyczaj umieszczać po wszystkich atrybutach, jako ta druga część definicji 2️⃣. W przypadku, gdy tworzymy własne metody (bo każda klasa w języku Python posiada też pewne "wbudowane" metody), to tworzymy je tak samo jak normalne funkcje, aczkolwiek z jednym dodatkowym szczegółem 👇:

class MyClass:
	def my_method(self):
		pass

W liście parametrów musi znaleźć się specjalny parametr o nazwie "self" 😮! Dotyczy to każdej funkcji jaką dodajemy do klasy 🫵! Zaraz przejdę do wyjaśnienia jego znaczenia, tylko idźmy po kolei z tematami 🙂.

W sytuacji, gdy potrzebujemy utworzyć mnóstwo atrybutów i/lub metod, to cały czas trzymamy się tej struktury, czyli najpierw same atrybuty, potem same metody ✅. To jest przyjęta zasada definiowania postaci każdej klasy i to w każdym języku jaki wspiera obiektowość 👍.

Klasa z atrybutem i metodą w języku Python

Klasa w języku Python jest konstrukcją służącą jako szablon dla przyszłych obiektów (kopii/instancji tej klasy), która może posiadać własne atrybuty (zmienne) oraz metody (funkcje).

Teraz zrobimy krok wstecz i przejdziemy do wyjaśnienia hasła "self" 😲!

CZYM JEST "SELF" W KLASIE W JĘZYKU PYTHON?

W Pythonie, gdy będziesz mieć do czynienia z klasami, często będziesz spotykać słowo kluczowe "self". Oznacza ono referencję do samego siebie, czyli w tym wypadku referencję do obiektu powstałego z tej klasy 💡. To jest po to, aby swobodnie odnosić do składowych i metod tego konkretnego obiektu.

Ponieważ klasa jest szablonem dla obiektów, musiał powstać jakiś sposób rozróżniania poszczególnych kopii między sobą 🧠. Python przyjmuje je w takiej formie, czyli parametru przechowującego referencję do danego obiektu, który jest umieszczany zawsze jako pierwszy w każdej metodzie, aby utrzymać łączność z tym samym obiektem pomiędzy różnymi blokami kodu 🔌.

Trzeba pamiętać o małej pułapce z tym związanej podczas wywoływania metod prosto z obiektu ⚠️! Mimo tego, iż ten parametr "self" istnieje i występuje w liście parametrów, to jednak nie wstawiamy w jego miejsce żadnej wartości 😱! Python samodzielnie przypisze tam właściwą wartość 🔥! Wywołując metodę musimy postępować tak, jakby tego parametru nie było 😮. Gdy przejdziemy do części związanej z wywoływaniem metod, to pokażę dokładnie ten przypadek 👀.

Przejdę teraz do kolejnej ważnej części związanej z metodami, gdyż wcześniej wspomniałem o wbudowanych metodach klasy i to też należy do podstawowej wiedzy ❗!

JAKIE SĄ WBUDOWANE METODY KLASY W JĘZYKU PYTHON?

Klasy w Pythonie mają kilka metod "zaszytych" w sobie, na które możemy się powoływać i skorzystać z nich do pisania własnych instrukcji 🌟! Każda z nich wyróżnia się bardzo charakterystycznym zapisem w postaci "otoczenia" nazwy dwoma znakami podkreślenia ("podłogą") po obu stronach 💥.

Ważna rzecz: nie wywołuj tych metod samodzielnie 🚫! To są specjalne metody, które wykonują się pod wpływem jakiegoś zdarzenia.

Jest kilka takich metod i nie ma potrzeby Ci ich wszystkich przedstawiać, natomiast oto 3 z nich jakie w mojej ocenie warto znać i stosować w praktyce, gdy zajdzie potrzeba 👇:

NAZWA ZNACZENIE MOMENT WYWOŁANIA
__new__ zarezerwowanie pamięci dla obiektu i zwrócenie go na wyjściu po wywołaniu konstruktora klasy (tworzenie zmiennej obiektowej)
__init__ inicjalizacja obiektu bezpośrednio po jego utworzeniu (konstruktor klasy) po utworzeniu obiektu
__str__ zwrócenie na wyjściu sformatowanego łańcucha znaków w chwili wypisania obiektu na strumień wyjściowy podając referencję do obiektu (np. wprowadzenie zmiennej obiektowej do wywołania funkcji "print")

Pełne zestawienie wszystkich funkcji wbudowanych w klasę możesz znaleźć w oficjalnej dokumentacji Pythona 📖.

Oto prosty przykład skorzystania z wbudowanej metody "__init__" celem wypisania komunikatu zaraz po utworzeniu obiektu 👇:

class MyClass:
	def __init__(self):
		print('Mój obiekt został zainicjowany')

Mając taki zapis, po utworzeniu obiektu tej klasy ujrzymy zapisany komunikat 🙂.

Warto wiedzieć, że formalnie wykonujemy w ten sposób niejakie "przesłanianie" metody (ang. overriding) 🔥. To jest zdefiniowanie nowego bloku kodu do tej samej metody występującej w klasie bazowej 💡. Możemy także "dopisywać" instrukcje do tych samych metod, aby nie utracić pierwotnego bloku i wtedy służy temu odwołanie się do klasy bazowej poprzez słowo kluczowe "super", które podstawiając do powyższego przykładu wyglądałoby tak 👇:

super().__init__()

Nie będę na ten moment przybliżać tego tematu, gdyż odchodzi od tematu artykułu 🙂. Przejdziemy za to do tematu związanego z metodami wbudowanymi, a mianowicie dodawanie parametrów do inicjalizacji ➕!

JAK DODAĆ PARAMETRY DO TWORZENIA OBIEKTU W JĘZYKU PYTHON?

Aby móc przekazać jakiś parametr podczas tworzenia obiektu w Pythonie, należy skorzystać z metody wbudowanej "__init__" i umieścić go wewnątrz nawiasów okrągłych, tak jak to robimy dla każdej funkcji mającej przyjmować jakieś parametry 😊.

Oto przykład przekazania jednego parametru 👇:

class MyClass:
	def __init__(self, my_attribute):
		self.my_attribute = my_attribute

Jest taki zwyczaj, że w momencie przekazywania parametru do konstruktora klasy (metody tworzącej obiekt), od razu tworzymy atrybut o tej samej nazwie i przypisujemy wartość równą wartości parametru (o ile potrzebujemy tak zrobić) 👍. Zwróć uwagę, że stosujemy parametr "self" i przez niego odbywa się tworzenie atrybutu i przypisywanie wartości 👀!

Kiedy mamy taki zapis, później wystarczy w momencie tworzenia obiektu wstawić wartość jaka ma być mu przekazana, bo pamiętaj, że te dane otrzymuje każdy z obiektów 💥! Klasa stanowi szablon dla obiektów i te instrukcje określają co ma się zdarzyć dla każdego nowego obiektu!

Powyższy zapis stosuje się w sytuacji, gdy chcemy mieć atrybut i możliwość przypisania mu dowolnej wartości w chwili tworzenia obiektu. Jeżeli jednak zależy nam na przypisaniu jednej konkretnej wartości atrybutowi, to wtedy możemy napisać tak 👇:

class MyClass():
	my_attribute = 0

Ewentualnie tak 👇:

class MyClass():
	def __init__(self):
		self.my_attribute = 0

Oba zapisy są równoważne i to już Twoja sprawa jak wygodniej będzie Ci się pisało 😉.

Dodam, że możemy też użyć metody "__new__", zamiast "__init__", lecz tam trzeba pamiętać o zwróceniu wartości w postaci referencji do obiektu, więc radzę korzystać tylko z metody "__init__", szczególnie gdy chodzi nam o przygotowanie już powstałego obiektu 👍.

Klasa z parametrem w języku Python

Aby klasa przyjmowała parametry, należy je określić w nagłówku jednej z metod wbudowanych: "__new__" lub "__init__".

Został nam ostatni podpunkt odnośnie tworzenia klas, czyli jakie nazwy powinny być nadawane klasom 🚀!

JAKIE SĄ ZASADY NADAWANIA NAZW KLASOM W JĘZYKU PYTHON?

Klasa w Pythonie, tak samo jak każdy inny element programu mający swoją nazwę, nie może mieć nazwy zaczynającej się od cyfry ani spacji ⛔. Natomiast w odróżnieniu od konwencji nazewniczych odnośnie zmiennych i funkcji, tutaj są następujące zalecenia 👇:

  • powinna być rzeczownikiem określającym "byt" tej klasy (np. ołówek, biurko, krzesło itp.),
  • powinna być napisana tak, że słowa nie są oddzielane żadnym znakiem, a każde z nich zaczyna się dużą literą (ten styl nazywa się "PascalCase" ℹ️).

To są te 2 zalecenia jakich warto się trzymać w nazywaniu swoich klas 👍.

Zakończyliśmy temat tworzenia klas 🏁. Możemy przejść do drugiej części artykułu: tworzenie i obsługa obiektów ❤️!

JAK STWORZYĆ OBIEKT W JĘZYKU PYTHON?

Kiedy mamy już utworzoną klasę, możemy na jej podstawie tworzyć obiekty 🏭! Postępujemy w następujący sposób 👇:

my_object = [nazwa klasy]([parametry])

Na przykład gdy chcemy utworzyć obiekt klasy o nazwie "MyClass", która nie wymaga żadnych parametrów, piszemy tak 👇:

my_object = MyClass()

Możesz kojarzyć ten zapis, gdyż w taki sam sposób tworzymy obiekty wbudowanych typów danych, zwłaszcza gdy potrzebujemy skonwertować wartość na pożądany typ 😉. Przypomnę tylko jak dla przykładu wygląda tworzenie nowego łańcucha znaków 👇:

my_string = str('Mój łańcuch znaków')

zatem widzisz w tym momencie, że ukazują się nam "naczynia połączone" i w taki sam sposób działa tworzenie obiektów już nam znanych typów danych 😄!

A to przykład, gdy klasa ma określone, że wymaga pojedynczego parametru 👇:

my_object = MyClass(30)

Taki sam zapis, jak przy wywołaniu funkcji 🙂. A to dlatego, że konstruktor klasy jest niczym innym, jak funkcją 🎉!

Obiekt w języku Python

Obiekt jest pojedynczym egzemplarzem klasy, z której powstaje.

Mamy obiekt, więc teraz spójrzmy co możemy z nim zrobić 😉. Zacznijmy od odwoływania się do atrybutów!

JAK ODWOŁAĆ SIĘ DO ATRYBUTU OBIEKTU W JĘZYKU PYTHON?

Jeżeli klasa posiada w sobie choć jeden atrybut, możemy się do niego dostać i to zarówno w celu odczytania jego wartości, jak i modyfikacji ✅!

Mając utworzony obiekt, uzyskujemy dostęp do atrybutu w następujący sposób 👇:

print(my_instance.my_attribute)

Po podaniu nazwy zmiennej obiektowej, piszemy znak kropki i zaraz po nim, bezbłędną nazwę atrybutu zgodną z nazwą podaną podczas tworzenia klasy 🔥! To jest ważne, aby się nie pomylić, gdyż wtedy Python zgłosi błąd, że nie rozpoznaje podanej nazwy (typ "AttributeError") i przerwie dalsze działanie programu jeśli nie przechwytujemy wyjątku 💥!

Powyższy zapis spowoduje pobranie wartości atrybutu i wypisanie go w konsoli 📝.

Odczyt wartości atrybutu obiektu w języku Python

Możesz odczytywać wartość atrybutu obiektu odwołując się do niego poprzez znak kropki i podając bezbłędnie jego nazwę zgodną z treścią klasy!

A tutaj zapis modyfikujący dany atrybut 👇:

my_instance.my_attribute = 50

Korzystamy z tych samych operatorów przypisania, o jakich pisałem już dawno w jednym z artykułów ℹ️.

Python zezwala na swobodną modyfikację atrybutów na zewnątrz klasy, aczkolwiek w mojej ocenie lepiej to robić wewnątrz klasy przy użyciu metod, ponieważ w momencie wystąpienia jakiegoś błędu będziesz od razu wiedzieć gdzie szukać problemu ✅. Gdy umieścisz te same modyfikacje w wielu miejscach poza klasą, już nie będzie tak łatwo znaleźć powodu występowania problemu i tylko stracisz czas ❌.

Modyfikacja wartości atrybutu obiektu w języku Python

Możesz również modyfikować wartość atrybutu obiektu stosując identyczny zapis i korzystając z operatora przypisania!

Teraz zobaczmy przykład wywoływania metody prosto z obiektu 🙂!

JAK WYWOŁAĆ METODĘ OBIEKTU W JĘZYKU PYTHON?

Gdy klasa posiada w sobie jakąś metodę utworzoną przez nas (nie uwzględniamy metod wbudowanych), wystarczy nam taki zapis 👇:

my_instance.my_method()

Podajemy nazwę zmiennej obiektowej, piszemy znak kropki, a następnie wywołujemy metodę dokładnie tak, jak funkcję "spoza" czegokolwiek 😊. Gdy funkcja oczekuje parametrów, to piszemy je tak samo, jak pokazywałem w artykule o funkcjach ℹ️.

Wywołanie metody obiektu w języku Python

Możesz wywoływać metody bezpośrednio z obiektu, korzystając ze znaki kropki i podając bezbłędną nazwę metody wraz z parametrami (jeśli ich oczekuje)!

Dotarliśmy do końca wyjaśniania wszystkich zagadnień odnośnie tworzenia klasy, wiemy jak tworzyć od nich obiekty oraz jak się odwoływać do atrybutów i metod 🔥! Czas na prosty przykład ⏩!

PRZYKŁAD UŻYCIA KLASY W JĘZYKU PYTHON

Przykład użycia klasy w Pythonie jaki mam do pokazania, to utworzenie nowego konta bankowego i wykonanie na nim operacji wpłacania oraz wypłacania pieniędzy 💵.

KLASA

Tak wygląda postać klasy dla konta bankowego 👇:

class BankAccount:
	money = 0

	def __init__(self):
		print('Utworzono nowe konto bankowe')

	def display_current_amount_of_money(self):
		print('Aktualny stan konta: ' + str(self.money))

	def deposit(self, money):
		self.money += money

		print('Wpłacono pieniądze na konto')

	def withdraw(self, money):
		if self.money >= money:
			self.money -= money

			print('Pomyślnie wypłacono pieniądze z konta')
		else:
			print('Niewystarczająca ilość pieniędzy na koncie')

Tłumaczę całą budowę 🧩!

Klasa posiada jeden atrybut oznaczający aktualną ilość pieniędzy na koncie w złotówkach 💲. Ponadto składa się z 4 następujących metod 👇:

  1. do wypisania komunikatu o utworzeniu konta (wbudowana metoda "__init__"),
  2. do wypisania aktualnej ilości pieniędzy na koncie ("display_current_amount_of_money"),
  3. do wpłacania pieniędzy na konto ("deposit"),
  4. do wypłacania pieniędzy z konta ("withdraw") z uwzględnieniem możliwości dokonania tego.

Myślę, że treść każdej z nich jest dość prosta, że nie wymaga dodatkowych akapitów 😁. Teraz utworzenie i obsługa obiektu!

UTWORZENIE OBIEKTU

Tutaj przykład użycia tej klasy jako utworzenie obiektu i wywoływanie od niej metod 👇:

my_bank_account = BankAccount()

my_bank_account.display_current_amount_of_money()
my_bank_account.deposit(100)
my_bank_account.display_current_amount_of_money()
my_bank_account.withdraw(100)
my_bank_account.display_current_amount_of_money()
my_bank_account.withdraw(100)

U góry mamy tworzenie obiektu konta bankowego 🏭. Niżej mamy różne wywołania metod uprzednio utworzonych w klasie, które przynoszą odpowiedni skutek, czyli po kolei 👇:

  1. wypisanie aktualnej ilości pieniędzy na koncie,
  2. wpłacanie pieniędzy na konto,
  3. wypisanie aktualnej ilości pieniędzy na koncie,
  4. wypłacenie pieniędzy z konta,
  5. wypisanie aktualnej ilości pieniędzy na koncie,
  6. wypłacenie pieniędzy z konta (tym razem nieudane - spróbuj sam(a) pogłówkować dlaczego 😉).

Koniec 🙂! Uruchamiając ten program w całości (postać klasy i tworzenie obiektu), Python utworzy obiekt klasy konta bankowego i pomyślnie wywoła wszystkie podane metody ❤️!

Tym przykładem kończę część związaną z korzystaniem z klasy, tylko jeszcze jedna drobna rzecz na finał, dla osób które będą miały zamiar uczyć się w przyszłości innych języków programowania 👀!

CZYM SIĘ RÓŻNI KLASA W JĘZYKU PYTHON OD INNYCH JĘZYKÓW?

Python wspiera programowanie obiektowe poprzez klasy i obiekty, natomiast nie w pełnym wydaniu ℹ️. Są takie języki obiektowe, w których występują dodatkowe techniki i zagadnienia, które są jeszcze bardziej ukierunkowane na pisanie obiektowe np. modyfikatory dostępu, czyli nakładanie zabezpieczeń przed uzyskaniem dostępu do elementów klasy z zewnątrz 🔒. Python nie posiada czegoś takiego ani dla klas, ani atrybutów, ani metod - po prostu tego nie ma ⛔. To nie jest język w pełni zorientowany obiektowo!

Z tego powodu, gdy kiedykolwiek sięgniesz po język programowania powiedzmy, "czysto obiektowy" (taki jak Java ☕), bądź pewny(-a), że wiedza o obiektowości w Pythonie nie będzie wyczerpywała wszystkich konstrukcji dotyczących tego stylu programowania ⚠️!


To tyle z najważniejszych informacji o klasach 😊. Artykuł wyszedł spory, lecz powinien rozwiać wszelkie wątpliwości pojawiające się przy pierwszym kontakcie z obiektowością 👍.

PODOBNE ARTYKUŁY