W poprzedniej lekcji (4A) zrobiliśmy w Pythonie razem duży krok naprzód, użyliśmy Słowników, żeby łączyć opis wydatku z jego kwotą. Zakończyliśmy teorią o Obiektach.
Dziś wchodzimy w świat C#, gdzie te obiekty są fundamentem wszystkiego. A na deser? Pokażemy, jak zrobić to samo w Pythonie, żebyś zobaczył/a, że te języki wcale tak bardzo się od siebie nie różnią.
Krok 1: Tworzymy podstawową Klasę w C#
W Pythonie słownik tworzyliśmy „w locie”. W C# musimy najpierw zdefiniować, jak wygląda nasza dana. Musimy stworzyć projekt.
Stwórz nowy projekt w Visual Studio ( może to być czas żeby zainstalować visual studio community, które do pisania kodu i kompilowania jest wygodniejsze niż vscode: https://visualstudio.microsoft.com/pl/thank-you-downloading-visual-studio/?sku=Community&channel=Stable&version=VS18&source=VSLandingPage&passive=false&cid=2500 ) / VS Code.
Stworzysz pierwsza świadomą klasę w twoim programie, do tej pory widziałeś taki podstawowy blok:

Teraz po using a przed klasą program dodasz swoją foremkę.
public class Transakcja
{
public string Opis { get; set; }
public decimal Kwota { get; set; }
public string Typ { get; set; }
}
Co tu się stało?
public class Transakcja: Ogłaszamy światu: „Hej, od teraz istnieje nowy typ danych o nazwie Transakcja!”.public string Opis { get; set; }: Każda transakcja musi mieć opis, który jest tekstem. To samo Kwota w formacie zmiennoprzecinkowym i Typ transakcji. oznaczenia get; set; to skrótowa informacja, że dane tej zmiennej mogą być pobierane i ustawiane.- Brak możliwości pomyłki: Jeśli spróbujesz wpisać liczbę do
Opis, C# nie pozwoli Ci nawet uruchomić programu. To jest ta słynna „kontrola typów”.
Krok 2: Tworzenie Obiektów czyli Wypiekamy Pierniczki 😉
Skoro mamy klasę, stwórzmy obiekt, czyli mamy juz foremke, upieczmy ciasteczko. W funkcji Main (tam gdzie zawsze piszemy kod), tworzenie obiektu wygląda tak:
Transakcja t1 = new Transakcja();
t1.Opis = "Pensja";
t1.Kwota = 5000;
t1.Typ = "Wpływ";
Transakcja t2 = new Transakcja
{
Opis = "Biedronka",
Kwota = -50,
Typ = "Wydatek"
};
Console.WriteLine($"Opis: {t1.Opis}, Kwota: {t1.Kwota}, Typ: {t1.Typ}");
Console.WriteLine($"Opis: {t2.Opis}, Kwota: {t2.Kwota}, Typ: {t2.Typ}");

Teraz dokładnie to wyjaśnię jeszcze raz. To co widzisz powyżej, czyli definicja klasy public class Transakcja ora utworzenie obiektu Transakcja t1 = new Transakcja(); to podstawy współczesnego programowania w najprostszej wersji.
Klasa zawiera właściwości, czyli takie wewnętrzne zmienne. poza tym, klasy mogą mieć metody, czyli wewnętrzne funkcje. Specjalną wersją metody jest konstruktor, czyli taka metoda, która tworzy dane w obiekcie na podstawie przekazanych przez program zmiennych. Najczęściej zmienne, nie będą w klasach public a private, czyli będą odizolowane od reszty kodu, a dostęp do nich, będzie realizowany tylko przez metody. Ale to później, najpierw przywyknij do tego co tu się dzieje.
Krok 3: Lista Obiektów (To, na co czekaliśmy)
Pamiętasz List<decimal>? Była fajna, ale trzymała tylko liczby. Teraz zrobimy listę naszych nowych, wypasionych obiektów.
List<Transakcja> historia = new List<Transakcja>(); // Tworzymy zmeinną historia przechowująca listę obiektów typu Transakcja
historia.Add(t1); // dodajemy obiekt do listy
historia.Add(t2);
foreach (Transakcja t in historia) // iterujemy po elementach listy
{
Console.WriteLine($"Opis: {t.Opis}, Kwota: {t.Kwota}, Typ: {t.Typ}");
}

Krok 4: C# Monitor Budżetu v4.0 (Kod Programu)
Złóżmy to w całość. Użyjemy List<Transakcja>, pętli foreach i instrukcji switch (która jest bliźniakiem pythonowego match case).
using System;
using System.Collections.Generic; // Niezbędne do List
using System.Globalization;
// Nasza Klasa (Foremka)
public class Transakcja
{
public string Opis { get; set; }
public decimal Kwota { get; set; }
public string Typ { get; set; }
}
class Program
{
static void Main()
{
Console.WriteLine("--- MONITOR BUDŻETU v4.0 (Obiekty) ---");
// Lista przechowująca nasze obiekty
List<Transakcja> historia = new List<Transakcja>();
while (true)
{
Console.WriteLine("\n1. Dodaj PRZYCHÓD");
Console.WriteLine("2. Dodaj WYDATEK");
Console.WriteLine("3. Pokaż Historię");
Console.WriteLine("4. Koniec");
Console.Write("Wybierz: ");
string wybor = Console.ReadLine();
// SWITCH - odpowiednik Pythonowego MATCH CASE
switch (wybor)
{
case "1":
DodajTransakcje(historia, "Przychód");
break;
case "2":
DodajTransakcje(historia, "Wydatek");
break;
case "3":
PokazHistorie(historia);
break;
case "4":
return; // Wyjście z programu
default:
Console.WriteLine("Nieznana opcja.");
break;
}
}
}
// METODA (Funkcja w C#)
// Zauważ: Przekazujemy listę jako parametr!
static void DodajTransakcje(List<Transakcja> bazaDanych, string typ)
{
Console.Write($"Podaj opis ({typ}): ");
string opis = Console.ReadLine();
Console.Write("Podaj kwotę: ");
string tekstKwota = Console.ReadLine();
if (decimal.TryParse(tekstKwota.Replace(",", "."), NumberStyles.Any, CultureInfo.InvariantCulture, out decimal kwota))
{
if (kwota <= 0)
{
Console.WriteLine("Kwota musi być dodatnia!");
return;
}
// Trik księgowego (minus dla wydatków)
decimal finalnaKwota = (typ == "Wydatek") ? kwota * -1 : kwota;
// TWORZYMY OBIEKT!
Transakcja nowaTransakcja = new Transakcja
{
Opis = opis,
Kwota = finalnaKwota,
Typ = typ
};
// Dodajemy obiekt do listy
bazaDanych.Add(nowaTransakcja);
Console.WriteLine("Zapisano!");
}
else
{
Console.WriteLine("Błąd kwoty.");
}
}
static void PokazHistorie(List<Transakcja> bazaDanych)
{
Console.WriteLine("\n--- TWOJE PARAGONY ---");
decimal suma = 0;
int i = 1;
// Pętla foreach wie, że 'pozycja' to 'Transakcja'
foreach (Transakcja pozycja in bazaDanych)
{
// Dzięki klasie mamy dostęp do .Opis, .Typ, .Kwota!
Console.WriteLine($"{i}. [{pozycja.Typ}] {pozycja.Opis}: {pozycja.Kwota} zł");
suma += pozycja.Kwota;
i++;
}
Console.WriteLine($"----------------\nSALDO: {suma} zł");
}
}

Krok 5: Python też to potrafi! (Python OOP)
Obiecałem, że pokażę, jak zastąpić słowniki klasami w Pythonie. Składnia jest inna, ale idea identyczna.
Otwórz w VScode nowy katalog i stwórz plik budzet.py
# Definicja Klasy w Pythonie
class Transakcja:
# __init__ to konstruktor - uruchamia się przy tworzeniu obiektu
# self oznacza "JA" (ten konkretny obiekt)
def __init__(self, opis, kwota, typ):
self.opis = opis
self.kwota = kwota
self.typ = typ
# Użycie w programie (zamiast słownika)
# Tworzymy obiekt:
nowy_rekord = Transakcja("Biedronka", -50.00, "Wydatek")
# Dostęp do danych (kropka zamiast nawiasów kwadratowych!):
print(nowy_rekord.opis, nowy_rekord.kwota, nowy_rekord.typ)
# Zamiast: nowy_rekord["opis"]
Jak widzisz definicja klasy w pythonie od razu musi zawierać konstruktor, czyli funkcję która nazywa się __init__.
Słowo self. oznacza, że zmienna należy do danego obiektu, że to jego właściwość. W PHP używa się słowa this.
W Pythonie używanie klas jest opcjonalne (dlatego w 4A użyliśmy słowników, bo szybciej), ale przy dużych projektach robi się to dokładnie tak, jak w C#.
Przykład z listą:
class Transakcja:
def __init__(self, opis, kwota, typ):
self.opis = opis
self.kwota = kwota
self.typ = typ
t1 = Transakcja("Pensja", 8000.00, "Wpływ")
t2 = Transakcja("Biedronka", -50.00, "Wydatek")
historia = []
historia.append(t1)
historia.append(t2)
for t in historia:
print(t.opis, t.kwota, t.typ)

Podsumowanie Lekcji 4 (A+B)
Zrobiłeś/aś gigantyczny postęp. Zobacz, gdzie byliśmy, a gdzie jesteśmy:
- Lekcja 1-2: Pojedyncze zmienne (
budzet = 100). - Lekcja 3: Listy liczb (
[100, -20, -50]). - Lekcja 4: Listy Obiektów (
Lista Transakcji).
Teraz nasz program „rozumie” świat. Nie operuje na cyferkach, ale na pojęciach biznesowych (Transakcja, Opis, Typ). To jest esencja bycia programistą.
Przybornik C# – Nowości z Lekcji 4B
W C# wszystko jest obiektem. Oto Twoje nowe narzędzia:
| Komenda / Słowo kluczowe | Co to robi? | Wyjaśnienie |
class Nazwa { ... } | Definiuje nową klasę (Foremkę). | Tworzysz swój własny typ danych, np. Samochód, Faktura, Użytkownik. |
public string Opis { get; set; } | Właściwość (Property). | Cechy twojej klasy. get pozwala czytać, set pozwala zmieniać wartość. |
new Nazwa() | Tworzy nową instancję (Obiekt). | Wykrawasz ciastko foremką. new Transakcja() powołuje obiekt do życia w pamięci. |
List<NazwaKlasy> | Lista, która przechowuje obiekty danej klasy. | Kontener, do którego wrzucasz tylko konkretne obiekty (np. listę zakupów). |
switch (zmienna) | Odpowiednik Pythonowego match. | Steruje przepływem programu (wybór opcji menu). |
static void Nazwa() | Metoda (Funkcja). | W C# funkcje muszą być wewnątrz klas. static oznacza (w uproszczeniu), że nie potrzebujemy obiektu, by jej użyć (jak narzędzia w warsztacie). |
obiekt.Pole | Kropka (.) służy do dostępu do wnętrza obiektu. | Jak otwieranie szufladki wewnątrz obiektu, żeby wyciągnąć dane. |
Przybornik Python – Wersja Obiektowa (Lekcja 4B)
W tej lekcji weszliśmy na poziom „Pro” w Pythonie. Zamiast luźnych słowników, tworzymy własne typy danych. Oto nowe pojęcia:
| Komenda / Słowo kluczowe | Co to robi? | Wyjaśnienie „na chłopski rozum” |
class Nazwa: | Definiuje nową Klasę (Foremkę). | Projektujesz nowy rodzaj danych. Od teraz Python wie, co to jest Transakcja. |
def __init__(self, ...): | Konstruktor. Specjalna funkcja, która uruchamia się automatycznie w momencie tworzenia nowego obiektu. | To moment, w którym wlewasz ciasto do foremki. Tutaj ustalasz startowe wartości (np. opis i kwotę). |
self | Oznacza „JA” (ten konkretny obiekt). | Kiedy tworzysz 100 transakcji, self pozwala każdej z nich wiedzieć, która jest która. self.opis znaczy: „MÓJ opis (a nie sąsiada)”. |
self.zmienna = wartosc | Tworzy Pole (Właściwość) w obiekcie. | Naklejasz etykietę na obiekt. Dzięki temu obiekt zapamiętuje tę daną na zawsze. |
obiekt.pole | Kropka (.) służy do wyciągania danych z obiektu. | Np. t1.kwota. Czytamy to: „Z obiektu t1 podaj mi wartość pola kwota”. |
NazwaKlasy(...) | Tworzy nową instancję (Obiekt). | Wywołuje konstruktor (__init__). Np. t1 = Transakcja(...) to narodziny nowego obiektu. |
Zadanie Domowe
W pythonie, zmień nasz program z lekcji poprzedniej tak, aby używał klas.

0 komentarzy