Kurs: Darmowy kurs Python dla początkujących
Lekcja 11: Podstawy programowania obiektowego
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:
