Lekcja 11 – Podstawy programowania obiektowego

Kurs: Darmowy kurs Python dla początkujących
Lekcja 11: Podstawy programowania obiektowego

⇓ spis treści ⇓


Klasy i obiekty

Programowanie obiektowe (ang. Object-Oriented Programming, OOP) to podejście do programowania, które umożliwia organizację kodu w postaci obiektów reprezentujących rzeczywiste byty. Obiekty są tworzone na podstawie klas, które definiują ich strukturę i zachowanie. Python obsługuje OOP w sposób prosty i intuicyjny.

1. Czym są klasy?

Klasa to schemat, według którego tworzone są obiekty. Klasa definiuje atrybuty (cechy) i metody (zachowania), które będą wspólne dla wszystkich obiektów utworzonych na jej podstawie.

# Definicja klasy
class Samochod:
    marka = "Nieznana"
    kolor = "Nieznany"

# Tworzenie obiektu klasy
moj_samochod = Samochod()
print(moj_samochod.marka)  # Wynik: Nieznana
print(moj_samochod.kolor)  # Wynik: Nieznany
2. Czym są obiekty?

Obiekt to konkretny egzemplarz klasy. Może mieć swoje unikalne cechy i wykonywać operacje zdefiniowane w klasie. Każdy obiekt ma dostęp do atrybutów i metod swojej klasy.

Przykład:

# Tworzenie dwóch obiektów
samochod1 = Samochod()
samochod2 = Samochod()

# Przypisywanie indywidualnych wartości
samochod1.marka = "Toyota"
samochod1.kolor = "Czerwony"

samochod2.marka = "BMW"
samochod2.kolor = "Niebieski"

# Wyświetlanie atrybutów
print(f"Samochód 1: {samochod1.marka}, {samochod1.kolor}")
print(f"Samochód 2: {samochod2.marka}, {samochod2.kolor}")

Wynik:

Samochód 1: Toyota, Czerwony
Samochód 2: BMW, Niebieski
3. Konstruktor __init__

Konstruktor to specjalna metoda w Pythonie, oznaczona jako __init__, która jest automatycznie wywoływana podczas tworzenia obiektu. Konstruktor pozwala na inicjalizację atrybutów obiektu w momencie jego tworzenia.

# Klasa z konstruktorem
class Samochod:
    def __init__(self, marka, kolor):
        self.marka = marka
        self.kolor = kolor

# Tworzenie obiektów z argumentami
samochod1 = Samochod("Toyota", "Czerwony")
samochod2 = Samochod("BMW", "Niebieski")

# Wyświetlanie atrybutów
print(f"Samochód 1: {samochod1.marka}, {samochod1.kolor}")
print(f"Samochód 2: {samochod2.marka}, {samochod2.kolor}")

Wynik:

Samochód 1: Toyota, Czerwony
Samochód 2: BMW, Niebieski
4. Metody w klasach

Metody to funkcje zdefiniowane wewnątrz klasy, które operują na obiektach tej klasy. Pierwszym argumentem każdej metody w Pythonie jest self, który odnosi się do bieżącego obiektu.

# Klasa z metodą
class Samochod:
    def __init__(self, marka, kolor):
        self.marka = marka
        self.kolor = kolor

    def opis(self):
        return f"Samochód marki {self.marka} w kolorze {self.kolor}."

# Tworzenie obiektu i wywoływanie metody
samochod = Samochod("Toyota", "Czerwony")
print(samochod.opis())

Wynik:

Samochód marki Toyota w kolorze Czerwonym.
5. Zmiana atrybutów obiektów

Atrybuty obiektu można zmieniać w dowolnym momencie po jego utworzeniu:

# Zmiana wartości atrybutu
samochod.kolor = "Zielony"
print(samochod.opis())

Wynik:

Samochód marki Toyota w kolorze Zielonym.
6. Atrybuty i metody klasy a instancji

Atrybuty klasy są wspólne dla wszystkich obiektów klasy, podczas gdy atrybuty instancji są unikalne dla każdego obiektu. Przykład:

class Samochod:
    liczba_kol = 4  # Atrybut klasy

    def __init__(self, marka, kolor):
        self.marka = marka  # Atrybut instancji
        self.kolor = kolor  # Atrybut instancji

# Dostęp do atrybutu klasy
print(Samochod.liczba_kol)  # Wynik: 4

# Tworzenie obiektu i dostęp do atrybutu instancji
samochod = Samochod("Toyota", "Czerwony")
print(samochod.marka)       # Wynik: Toyota
print(samochod.liczba_kol)  # Wynik: 4

Wynik:

4
Toyota
4

Atrybuty i metody

W programowaniu obiektowym klasy i obiekty mają dwa główne elementy:

  • Atrybuty – zmienne przypisane do klasy lub obiektu, które przechowują dane.
  • Metody – funkcje przypisane do klasy, które definiują zachowanie obiektów.
1. Atrybuty instancji

Atrybuty instancji są unikalne dla każdego obiektu. Tworzymy je zazwyczaj w konstruktorze __init__. Przykład:

class Samochod:
    def __init__(self, marka, kolor):
        self.marka = marka  # Atrybut instancji
        self.kolor = kolor  # Atrybut instancji

# Tworzenie obiektów z różnymi wartościami atrybutów
samochod1 = Samochod("Toyota", "Czerwony")
samochod2 = Samochod("BMW", "Niebieski")

print(samochod1.marka)  # Wynik: Toyota
print(samochod2.kolor)  # Wynik: Niebieski
2. Atrybuty klasy

Atrybuty klasy są wspólne dla wszystkich obiektów klasy. Definiujemy je bezpośrednio w ciele klasy:

class Samochod:
    liczba_kol = 4  # Atrybut klasy

    def __init__(self, marka, kolor):
        self.marka = marka
        self.kolor = kolor

# Dostęp do atrybutu klasy
print(Samochod.liczba_kol)  # Wynik: 4

# Atrybut klasy jest taki sam dla wszystkich obiektów
samochod1 = Samochod("Toyota", "Czerwony")
samochod2 = Samochod("BMW", "Niebieski")
print(samochod1.liczba_kol)  # Wynik: 4
print(samochod2.liczba_kol)  # Wynik: 4
3. Metody instancji

Metody instancji to funkcje, które operują na danych obiektu. Pierwszym argumentem każdej metody musi być self, który odnosi się do konkretnego obiektu.

class Samochod:
    def __init__(self, marka, kolor):
        self.marka = marka
        self.kolor = kolor

    def opis(self):
        return f"Samochód marki {self.marka} w kolorze {self.kolor}."

# Tworzenie obiektu i wywoływanie metody instancji
samochod = Samochod("Toyota", "Czerwony")
print(samochod.opis())

Wynik:

Samochód marki Toyota w kolorze Czerwony.
4. Metody klasy

Metody klasy są oznaczane dekoratorem @classmethod i jako pierwszy argument przyjmują cls, który odnosi się do samej klasy (a nie do obiektu). Są one używane do operacji na poziomie klasy.

class Samochod:
    liczba_kol = 4  # Atrybut klasy

    @classmethod
    def zmien_liczbe_kol(cls, nowa_liczba):
        cls.liczba_kol = nowa_liczba

# Zmiana wartości atrybutu klasy za pomocą metody klasy
print(Samochod.liczba_kol)  # Wynik: 4
Samochod.zmien_liczbe_kol(6)
print(Samochod.liczba_kol)  # Wynik: 6
5. Metody statyczne

Metody statyczne są oznaczane dekoratorem @staticmethod. Nie przyjmują one argumentu self ani cls, ponieważ nie operują ani na obiektach, ani na klasach. Są one używane do wykonywania niezależnych zadań związanych z klasą.

class Samochod:
    @staticmethod
    def przywitaj():
        print("Witaj w świecie samochodów!")

# Wywoływanie metody statycznej
Samochod.przywitaj()

Wynik:

Witaj w świecie samochodów!
6. Zmiana atrybutów obiektów i klas

Możesz modyfikować wartości atrybutów zarówno dla konkretnego obiektu, jak i dla całej klasy:

class Samochod:
    liczba_kol = 4  # Atrybut klasy

    def __init__(self, marka, kolor):
        self.marka = marka  # Atrybut instancji
        self.kolor = kolor  # Atrybut instancji

# Modyfikacja atrybutów instancji
samochod1 = Samochod("Toyota", "Czerwony")
samochod1.kolor = "Zielony"
print(samochod1.kolor)  # Wynik: Zielony

# Modyfikacja atrybutów klasy
Samochod.liczba_kol = 6
print(Samochod.liczba_kol)  # Wynik: 6
7. Przykład praktyczny

Przykład klasy opisującej telefon z metodami instancji, klasy i statycznymi:

class Telefon:
    liczba_modeli = 0  # Atrybut klasy

    def __init__(self, marka, model):
        self.marka = marka
        self.model = model
        Telefon.liczba_modeli += 1

    def opis(self):
        return f"Telefon marki {self.marka}, model {self.model}."

    @classmethod
    def liczba_wszystkich_modeli(cls):
        return f"Liczba wyprodukowanych modeli: {cls.liczba_modeli}"

    @staticmethod
    def informacja():
        print("Telefony to nowoczesne narzędzia komunikacji.")

# Przykład użycia
telefon1 = Telefon("Apple", "iPhone 13")
telefon2 = Telefon("Samsung", "Galaxy S21")

print(telefon1.opis())
print(Telefon.liczba_wszystkich_modeli())
Telefon.informacja()

Wynik:

Telefon marki Apple, model iPhone 13.
Liczba wyprodukowanych modeli: 2
Telefony to nowoczesne narzędzia komunikacji.

Prosty projekt: Zarządzanie listą zadań

W tym projekcie stworzysz prostą aplikację do zarządzania listą zadań przy użyciu programowania obiektowego w Pythonie. Aplikacja pozwoli na dodawanie, usuwanie i wyświetlanie zadań. Jest to świetny sposób na naukę podstaw programowania obiektowego w praktyce.

1. Struktura klasy

Na początek utworzymy klasę ListaZadan, która będzie przechowywać listę zadań i metody do zarządzania nimi.

class ListaZadan:
    def __init__(self):
        """Konstruktor tworzy pustą listę zadań."""
        self.zadania = []

    def dodaj_zadanie(self, zadanie):
        """Dodaje nowe zadanie do listy."""
        self.zadania.append(zadanie)
        print(f"Zadanie '{zadanie}' zostało dodane.")

    def usun_zadanie(self, zadanie):
        """Usuwa zadanie z listy, jeśli istnieje."""
        if zadanie in self.zadania:
            self.zadania.remove(zadanie)
            print(f"Zadanie '{zadanie}' zostało usunięte.")
        else:
            print(f"Zadanie '{zadanie}' nie istnieje na liście.")

    def wyswietl_zadania(self):
        """Wyświetla wszystkie zadania na liście."""
        if not self.zadania:
            print("Lista zadań jest pusta.")
        else:
            print("Twoje zadania:")
            for i, zadanie in enumerate(self.zadania, start=1):
                print(f"{i}. {zadanie}")
2. Przykładowe użycie

Oto przykład działania aplikacji:

# Tworzenie obiektu listy zadań
moja_lista = ListaZadan()

# Dodawanie zadań
moja_lista.dodaj_zadanie("Zrobić zakupy")
moja_lista.dodaj_zadanie("Odpisać na maile")
moja_lista.dodaj_zadanie("Posprzątać mieszkanie")

# Wyświetlanie zadań
moja_lista.wyswietl_zadania()

# Usuwanie zadania
moja_lista.usun_zadanie("Odpisać na maile")

# Wyświetlanie zadań po usunięciu
moja_lista.wyswietl_zadania()

Wynik:

Zadanie 'Zrobić zakupy' zostało dodane.
Zadanie 'Odpisać na maile' zostało dodane.
Zadanie 'Posprzątać mieszkanie' zostało dodane.
Twoje zadania:
1. Zrobić zakupy
2. Odpisać na maile
3. Posprzątać mieszkanie
Zadanie 'Odpisać na maile' zostało usunięte.
Twoje zadania:
1. Zrobić zakupy
2. Posprzątać mieszkanie
3. Rozszerzenie projektu

Możesz rozbudować projekt, dodając nowe funkcje, takie jak:

  • Zapisywanie listy zadań do pliku.
  • Odczyt listy zadań z pliku.
  • Oznaczanie zadań jako ukończone.
4. Zapisywanie i odczyt z pliku

Oto, jak można dodać funkcję zapisu i odczytu z pliku:

class ListaZadan:
    def __init__(self):
        self.zadania = []

    def dodaj_zadanie(self, zadanie):
        self.zadania.append(zadanie)
        print(f"Zadanie '{zadanie}' zostało dodane.")

    def usun_zadanie(self, zadanie):
        if zadanie in self.zadania:
            self.zadania.remove(zadanie)
            print(f"Zadanie '{zadanie}' zostało usunięte.")
        else:
            print(f"Zadanie '{zadanie}' nie istnieje na liście.")

    def wyswietl_zadania(self):
        if not self.zadania:
            print("Lista zadań jest pusta.")
        else:
            print("Twoje zadania:")
            for i, zadanie in enumerate(self.zadania, start=1):
                print(f"{i}. {zadanie}")

    def zapisz_do_pliku(self, nazwa_pliku):
        with open(nazwa_pliku, "w") as plik:
            for zadanie in self.zadania:
                plik.write(zadanie + "\n")
        print(f"Lista zadań została zapisana do pliku '{nazwa_pliku}'.")

    def wczytaj_z_pliku(self, nazwa_pliku):
        try:
            with open(nazwa_pliku, "r") as plik:
                self.zadania = [linia.strip() for linia in plik.readlines()]
            print(f"Lista zadań została wczytana z pliku '{nazwa_pliku}'.")
        except FileNotFoundError:
            print(f"Plik '{nazwa_pliku}' nie został znaleziony.")
5. Przykład z zapisem i odczytem
# Tworzenie obiektu listy zadań
moja_lista = ListaZadan()

# Dodawanie zadań
moja_lista.dodaj_zadanie("Zrobić zakupy")
moja_lista.dodaj_zadanie("Posprzątać mieszkanie")

# Zapis do pliku
moja_lista.zapisz_do_pliku("zadania.txt")

# Odczyt z pliku
moja_lista.wczytaj_z_pliku("zadania.txt")

# Wyświetlanie zadań po odczycie
moja_lista.wyswietl_zadania()

Wynik:

Zadanie 'Zrobić zakupy' zostało dodane.
Zadanie 'Posprzątać mieszkanie' zostało dodane.
Lista zadań została zapisana do pliku 'zadania.txt'.
Lista zadań została wczytana z pliku 'zadania.txt'.
Twoje zadania:
1. Zrobić zakupy
2. Posprzątać mieszkanie

Następna lekcja ==> Tworzenie prostego kalkulatora



Spis Treści - darmowy kurs Python dla początkujących


Lekcja 1: Wprowadzenie do programowania
- Co to jest programowanie?
- Dlaczego warto uczyć się Pythona?
- Instalacja Python i wprowadzenie do edytorów (IDLE, VS Code).
Lekcja 2: Pierwszy program w Pythonie
- Składnia Pythona.
- Wyświetlanie tekstu (funkcja print).
- Komentarze i ich znaczenie.
Lekcja 3: Podstawowe typy danych
- Liczby: int, float.
- Ciągi znaków (stringi).
- Typ logiczny (boolean).
- Funkcja type.
Lekcja 4: Zmienne i operatory
- Deklaracja i przypisywanie zmiennych.
- Operatory arytmetyczne, porównania, logiczne.
Lekcja 5: Listy i krotki
- Tworzenie list i krotek.
- Indeksowanie, dodawanie, usuwanie elementów.
- Operacje na listach.
Lekcja 6: Słowniki i zbiory
- Tworzenie i operacje na słownikach.
- Iteracja po słownikach.
- Zbiory i ich zastosowania.
Lekcja 7: Instrukcje warunkowe
- Instrukcje if, elif, else.
- Operatory logiczne w praktyce.
Lekcja 8: Pętle
- Pętla for i while.
- Instrukcje break, continue, else w pętlach.
Lekcja 9: Funkcje
- Tworzenie i wywoływanie funkcji.
- Argumenty i wartości domyślne.
- Funkcje anonimowe (lambda).
Lekcja 10: Praca z plikami
- Otwieranie, czytanie i zapisywanie plików.
- Obsługa błędów przy pracy z plikami.
Lekcja 11: Podstawy programowania obiektowego
- Klasy i obiekty.
- Atrybuty i metody.
- Prosty projekt: Zarządzanie listą zadań.
Lekcja 12: Tworzenie prostego kalkulatora
- Łączenie funkcji i warunków.
- Obsługa błędów (try-except).
Lekcja 13: Zarządzanie plikami tekstowymi
- Program do przechowywania i wyszukiwania notatek w plikach.
Lekcja 14: Prosta gra tekstowa w Python
- Wprowadzenie do pętli i logiki gry.
- Interaktywna gra konsolowa, np. zgadywanie liczby.

Jeśli chciałbyś być poinformowany o następnych kursach to zapisz się do naszego newslettera: