1/10
Programowanie Strukturalne i Obiektowe

Wstęp: Dlaczego potrzebujemy nowego podejścia?

W tradycyjnym programowaniu (strukturalnym) skupialiśmy się na funkcjach i procedurach, które przetwarzają dane. Program był listą instrukcji wykonywanych krok po kroku.

Wraz ze wzrostem złożoności systemów, takie podejście staje się trudne w utrzymaniu. Rozwiązaniem jest Programowanie Obiektowe (OOP).

  • Modelowanie rzeczywistości: Tworzymy cyfrowe odpowiedniki obiektów ze świata realnego.
  • Organizacja kodu: Łączymy dane i operacje na nich w jedną całość.
  • Modularność: Łatwiejsze rozbudowywanie i naprawianie programu.
Porównanie klocków kodu vs połączonych modułów
2/10
Paradygmat proceduralny vs obiektowy

Różnice w myśleniu

Wyobraźmy sobie symulację samochodu:

  • Podejście proceduralne: Mamy funkcję jedz(auto, dystans) i tankuj(auto, litry). Dane samochodu są luźno rozrzucone jako zmienne.
  • Podejście obiektowe: Mamy obiekt samochod. On sam "wie", ile ma paliwa i posiada metodę jedz().
W programowaniu strukturalnym funkcje są nadrzędne nad danymi. W obiektowym – dane i funkcje są nierozłączne.
Schemat: Funkcje -> Dane vs Obiekt{Dane + Metody}
3/10
Podstawowe pojęcia: Klasa i obiekt

Klasa jako matryca

Zanim powstanie konkretny obiekt, musimy stworzyć jego opis. To jest właśnie klasa.

  • Klasa: Projekt, schemat, przepis (np. projekt domu).
  • Obiekt (instancja): Konkretny byt stworzony na podstawie klasy (np. Twój dom przy ul. Kwiatowej).

Możemy mieć jedną klasę student, ale tysiące obiektów tej klasy, z których każdy ma inne nazwisko i numer indeksu.

Ilustracja: Foremka do ciastek (Klasa) i ciastka (Obiekty)
4/10
Pierwsza klasa w Pythonie

Składnia słowa kluczowego class

W Pythonie definiujemy klasę za pomocą słowa class. Nazwy klas zwyczajowo piszemy z wielkiej litery (PascalCase).

class Student:
    pass  # Pusta klasa, nic jeszcze nie robi

# Tworzenie obiektów (instancji)
student_adam = Student()
student_ewa = Student()

print(student_adam)  # Wyświetli informację o obiekcie w pamięci

Użycie nawiasów po nazwie klasy wywołuje proces tworzenia obiektu.

5/10
Konstruktor __init__

Inicjalizacja obiektu

Aby obiekt otrzymał konkretne dane w momencie powstania, używamy specjalnej metody __init__. Jest to tzw. metoda magiczna lub konstruktor.

class Student:
    def __init__(self, imie, nazwisko):
        self.imie = imie
        self.nazwisko = nazwisko

# Przekazujemy dane przy tworzeniu
s1 = Student("Jan", "Kowalski")
print(s1.imie)  # Jan
print(s1.nazwisko)  # Kowalski

Zmienne przypisane do self stają się atrybutami (polami) obiektu.

6/10
Czym jest parametr self?

Odwołanie do samego siebie

self to pierwszy parametr każdej metody w klasie. Reprezentuje on konkretny obiekt, na którym właśnie pracujemy.

  • Wewnątrz klasy nie wiemy, jak użytkownik nazwie obiekt (s1, student_adam?).
  • Przez self klasa mówi: "zmień imię w TEJ instancji, którą aktualnie obsługujesz".
W Pythonie self musi być jawnie zdefiniowany jako pierwszy argument metody, ale przy wywoływaniu metody go pomijamy.
Schemat: self jako wskaźnik na konkretny obiekt w pamięci
7/10
Atrybuty instancji (pola)

Dane przechowywane wewnątrz obiektu

Atrybuty to zmienne należące do obiektu. Przechowują one jego stan (cechy).

class Samochod:
    def __init__(self, marka, model, przebieg=0):
        self.marka = marka
        self.model = model
        self.przebieg = przebieg

auto1 = Samochod("Toyota", "Corolla")
print(f"Mój {auto1.marka} ma {auto1.przebieg} km")

Atrybuty mogą mieć wartości domyślne (jak przebieg powyżej).

8/10
Metody instancji

Funkcje wewnątrz klasy

Metody to zachowania obiektu. Definiujemy je jak zwykłe funkcje, ale wewnątrz bloku class.

class Pies:
    def __init__(self, imie):
        self.imie = imie

    def szczekaj(self):
        print(f"{self.imie}: Hau! Hau!")

moj_pies = Pies("Burek")
moj_pies.szczekaj()  # Wywołanie zachowania

Metody mogą modyfikować stan obiektu lub wykonywać operacje na jego atrybutach.

9/10
Modyfikowanie stanu obiektu

Interakcja z obiektem

Metody pozwalają na bezpieczną aktualizację danych obiektu.

class KontoBankowe:
    def __init__(self, saldo):
        self.saldo = saldo

    def depozyt(self, kwota):
        self.saldo += kwota
        print(f"Wpłacono {kwota}. Stan: {self.saldo}")

moje_konto = KontoBankowe(1000)
moje_konto.depozyt(500)

To podejście zapobiega błędom – logika wpłaty jest zamknięta w jednym miejscu w kodzie.

10/10
Podsumowanie części 1

Co już wiemy?

  • OOP to modelowanie świata za pomocą obiektów łączących dane i zachowania.
  • Klasa to definicja (matryca), a obiekt to jej konkretny egzemplarz.
  • __init__ to miejsce, gdzie nadajemy obiektowi cechy początkowe.
  • self to sposób na odwołanie się do danych konkretnego obiektu wewnątrz klasy.
  • Atrybuty to cechy obiektu, a metody to jego akcje.

W kolejnej prezentacji przyjrzymy się bliżej różnym rodzajom metod i atrybutów!

Grafika: Mapowanie Klasa Pies -> Konkretne Obiekty (Reksio, Azor)