Zrozumieć różnicę między klasą (opis typu) a obiektem (konkretna instancja) oraz historyczne źródła OOP.
Programowanie obiektowe narodziło się w Simula 67 (Dahl & Nygaard, Norwegia), gdzie pojęcie klasy służyło do modelowania procesów symulacyjnych. Smalltalk (Kay, lata 70.) uczynił obiekt absolutną jednostką programu. C++ i Java spopularyzowały OOP w przemyśle w latach 80.–90. Python od wersji 2.2 ma ujednolicony model obiektów (new-style classes): wszystko jest obiektem, nawet liczby i funkcje.
| Pojęcie | Analogia | W Pythonie |
|---|---|---|
| Klasa | Projekt domu, forma ciastek | class Student: |
| Obiekt | Konkretny dom, konkretne ciastko | jan = Student("Jan", 1) |
| Instancja | Synonim obiektu | jan jest instancją Student |
| Atrybut | Cecha egzemplarza | jan.name, jan.year |
| Metoda | Operacja na egzemplarzu | jan.enroll() |
Klasa definiuje typ — zestaw możliwych atrybutów i metod. Obiekt jest wartością tego typu — z własnym, konkretnym stanem.
Diagram: diagrams/topic_01.png
Plik: examples/class_object_story.py
from dataclasses import dataclass
@dataclass
class Student:
name: str
year: int
def describe_student(student: Student) -> str:
return f"{student.name} (rok {student.year})"
if __name__ == "__main__":
print(describe_student(Student("Jan", 1)))Interpretacja:
Studentto klasa — definicja struktury,Student("Jan", 1)tworzy obiekt z konkretnym stanem (name="Jan",year=1),describe_studentdziała na dowolnym obiekcieStudent— to programowanie do typu.
# Wersja bez klas — szybko staje się krucha:
student = {"name": "Jan", "year": 1}
# Nic nie chroni przed błędnym kluczem ani brakującym polem.Klasa daje:
- enkapsulację (pola + metody razem),
- walidację w konstruktorze,
- czytelność (typ mówi o intencji projektanta).
- Uruchom
examples/class_object_story.py. - Utwórz klasę
Coursez polaminame: striects: int. - Stwórz 3 instancje i wstaw je na listę.
- Napisz funkcję filtrującą kursy z
ects >= 5. - Dodaj metodę
__str__doCoursei sprawdźprint(course).
- Student rozumie różnicę między definicją klasy a tworzeniem obiektu.
- Student potrafi napisać prostą klasę domenową i funkcję operującą na jej instancjach.
- szablon:
exercises/tasks.py - przykładowe rozwiązanie:
exercises/solutions_01.py - testy:
exercises/test_solutions.py
Zadanie: napisz count_first_year(students: list[Student]) -> int.
- Wyjaśnij różnicę semantyczną: klasa, obiekt, instancja.
- Jaką przewagę daje klasa nad słownikiem w modelowaniu domeny?
- Podaj przykład, gdzie OOP jest lepsze niż funkcje bez klas.
- Czym różni się nazwa klasy od obiektu przez nią tworzonego?
- Jak przetestować poprawność tworzenia obiektów?
- https://docs.python.org/3/tutorial/classes.html
- G. Booch, Object-Oriented Analysis and Design with Applications.
- B. Meyer, Object-Oriented Software Construction.
