Klasy i obiekty Pythona: samouczek OOP z prawdziwymi przykładami

  1. Strona główna
  2. Blog
  3. Rozwój oprogramowania

Rozwój oprogramowania

Klasy i obiekty Pythona: Samouczek OOP z prawdziwymi przykładami

Naucz się obiektowego języka Python, budując coś prawdziwego. Twórz klasy, zrozum siebie i __init__, udostępniaj zachowania poprzez dziedziczenie, chroń dane za pomocą właściwości i wiedz, kiedy klasa jest niewłaściwym narzędziem.

10 min czytania
Klasy i obiekty w Pythonie: tutorial OOP z prawdziwymi przykładami

Najważniejsze

  • Klasa to projekt, a obiekt to jedna rzecz zbudowana na jego podstawie.
  • __init__ konfiguruje każdy nowy obiekt, a self odnosi się do tego obiektu.
  • Atrybuty ustawione w klasie są udostępniane. Atrybuty ustawione na self należą do jednego obiektu.
  • Użyj @dataclass dla klas przechowujących dane i preferuj proste funkcje, gdy nie ma stanu do zachowania.

W miarę rozrastania się skryptu kończy się przekazywanie tej samej grupy zmiennych między funkcjami i trudno jest określić, które dane należą do której logiki. Klasy i obiekty Pythona rozwiązują ten problem, łącząc dane i zachowania w jedną całość.

W tym samouczku krok po kroku budujemy małe konto bankowe i dodajemy każdy pomysł OOP tylko wtedy, gdy rozwiązuje problem. Każdy przykład uruchomiliśmy w Pythonie 3.13 i pokazane dane wyjściowe pochodzą z tego uruchomienia. Jeśli dopiero zaczynasz przygodę z tym językiem, przeczytaj najpierw nasz samouczek Pythona dla początkujących.

Czym są klasy i obiekty?

Klasa opisuje, czym coś jest i co może zrobić. obiekt, zwany także instancją, to konkretny obiekt utworzony na podstawie tego opisu. „Konto” to klasa, natomiast konto Ashy i konto Bena to dwa obiekty.

Termin Znaczenie Przykład
Klasa Plan Konto
Obiekt lub instancja Powstała z niego jedna rzecz a = Konto("Asha")
Atrybut Dane o obiekcie a.balance
Metoda Funkcja w klasie a.deposit(50)

Przez cały czas używałeś przedmiotów. W Pythonie ciągi znaków, listy, a nawet funkcje są obiektami, dlatego możesz pisać "hello".upper().

Twoje pierwsze zajęcia

class Account:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance

    def deposit(self, amount):
        if amount <= 0:
            raise ValueError("amount must be positive")
        self.balance += amount
        return self.balance

a = Account("Asha", 100)
b = Account("Ben")

a.deposit(50)
print(a.balance, b.balance)

# 150 0

__init__ uruchamia się automatycznie za każdym razem, gdy tworzysz obiekt i ustawia stan początkowy. Depozyt w a nie dotyczył b, ponieważ każdy obiekt ma swoje własne dane. Należy zauważyć, że metoda ta chroni także wagę przed złą wartością. Nasz przewodnik po obsłudze wyjątków w Pythonie wyjaśnia raise bardziej szczegółowo.

Czym jest jaźń?

self to po prostu obiekt, nad którym pracuje metoda. Kiedy piszesz a.deposit(50), Python skutecznie wywołuje Account.deposit(a, 50), przekazując obiekt jako pierwszy argument. W ten sposób jedna definicja metody może obsłużyć każdy obiekt.

Nazwa self to silna konwencja, a nie słowo kluczowe, ale zawsze jej używaj. Zapomnienie o tym w definicji metody jest najczęstszym błędem początkujących i powoduje mylący komunikat dotyczący liczby argumentów.

Atrybuty klas a atrybuty instancji

Atrybut ustawiony bezpośrednio w treści klasy jest wspólny dla wszystkich obiektów. Jeden zestaw na self należy tylko do tego obiektu. Ten przykład pokazuje, jak zachowują się wyszukiwania:

class Account:
    interest_rate = 0.04    # class attribute

    def __init__(self, owner, balance=0):
        self.owner = owner  # instance attribute
        self.balance = balance

a = Account("Asha", 100)
b = Account("Ben")
print(a.interest_rate, b.interest_rate)   # 0.04 0.04

Account.interest_rate = 0.05
print(a.interest_rate, b.interest_rate)   # 0.05 0.05

a.interest_rate = 0.09
print(a.interest_rate, b.interest_rate, Account.interest_rate)
# 0.09 0.05 0.05

Ta ostatnia linijka zaskakuje ludzi. Przypisanie poprzez a nie zmieniło wspólnej wartości. Utworzono nowy atrybut instancji w a, który ukrywa klasę. Python najpierw patrzy na obiekt, a następnie na klasę.

Metody specjalne (dunder).

Metody z podwójnym podkreśleniem umożliwiają obiektom współpracę z wbudowanymi funkcjami Pythona. Bez nich wydruk konta pokazuje bezużyteczny adres pamięci. Dodanie dwóch daje czytelną formę:

    def __str__(self):
        return f"{self.owner}: {self.balance}"

    def __repr__(self):
        return f"Account({self.owner!r}, {self.balance})"

print(a)        # Asha: 150
print([a, b])   # [Account('Asha', 150), Account('Ben', 0)]
Metoda Wywołane przez
__init__ Tworzenie obiektu
__str__ print(obj), str(obj)
__repr__ Debugowanie lub pokazywanie go na liście
__eq__ a == b
__len__ len(obj)
__add__ a + b

Dziedziczenie

Dziedziczenie pozwala nowej klasie ponownie wykorzystać istniejącą i zmienić tylko to, co się różni. Tutaj Savings to Account z dodatkowym ustawieniem:

class Savings(Account):
    def __init__(self, owner, balance=0, limit=3):
        super().__init__(owner, balance)
        self.limit = limit

    def __str__(self):
        return f"{super().__str__()} (savings)"

s = Savings("Chitra", 500)
s.deposit(100)
print(s, isinstance(s, Account), s.limit)

# Chitra: 600 (savings) True 3

super() wywołuje wersję rodzica, więc logika konfiguracji nie jest powtarzana. deposit zostało odziedziczone w dotychczasowej postaci, a __str__ zostało zastąpione w celu dodania etykiety. Dziedziczenia używaj tylko w przypadku prawdziwej relacji „jest”. Jeśli klasa po prostu czegoś potrzebuje, na przykład samochodu wymagającego silnika, nadaj jej ten obiekt jako atrybut. Nazywa się to kompozycją i jest zwykle bardziej elastyczne niż głębokie łańcuchy dziedziczenia.

Polimorfizm

Polimorfizm oznacza, że różne obiekty mogą odpowiadać na to samo wywołanie metody na swój własny sposób. Kod wywołujący nie musi znać dokładnego typu:

class Square:
    def __init__(self, side):
        self.side = side
    def area(self):
        return self.side ** 2

class Circle:
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        return round(3.14159 * self.radius ** 2, 2)

for shape in [Square(3), Circle(2)]:
    print(type(shape).__name__, shape.area())

# Square 9
# Circle 12.57

Te dwie klasy nie mają nawet wspólnego rodzica. Python dba tylko o to, aby obiekt miał metodę area, czyli podejście znane jako wpisywanie kaczek. Dodanie Triangle później nie wymagałoby żadnych zmian w pętli.

Hermetyzacja i właściwości

Python nie ma prawdziwie prywatnych atrybutów i zamiast tego opiera się na konwencjach. Pojedyncze podkreślenie, jak w _price, mówi innym programistom „to sprawa wewnętrzna, proszę nie dotykać”. Aby sprawdzić wartości po ich ustawieniu, użyj właściwości, która z zewnątrz wygląda jak zwykły atrybut:

class Product:
    def __init__(self, price):
        self.price = price

    @property
    def price(self):
        return self._price

    @price.setter
    def price(self, value):
        if value < 0:
            raise ValueError("price cannot be negative")
        self._price = value

p = Product(100)
p.price = 150
print(p.price)      # 150
p.price = -5        # ValueError: price cannot be negative

Oznacza to, że możesz zacząć od zwykłego atrybutu i później dodać weryfikację bez zmiany kodu korzystającego z tej klasy. Nie pisz więc z przyzwyczajenia metod get_price() i set_price(), jak w Javie. Składnia @ to dekorator, który wyjaśnimy w Wyjaśnienie dekoratorów Pythona.

Metody klasowe i metody statyczne

class Temperature:
    def __init__(self, celsius):
        self.celsius = celsius

    @classmethod
    def from_fahrenheit(cls, f):
        return cls(round((f - 32) * 5 / 9, 1))

    @staticmethod
    def is_freezing(celsius):
        return celsius <= 0

Temperature.from_fahrenheit(212).celsius   # 100.0
Temperature.is_freezing(-3)                # True
Wpisz Pierwszy argument Użyj go do
Metoda instancji siebie Praca z danymi jednego obiektu
@classmethod kl Konstruktorzy alternatywni
@staticmethod Żadne Pomocnicy związani z klasą

Klasy danych

Kiedy klasa przechowuje głównie dane, ręczne pisanie __init__, __repr__ i __eq__ jest uciążliwe. @dataclass generuje je na podstawie adnotacji typu:

from dataclasses import dataclass, field

@dataclass
class Item:
    name: str
    price: int
    tags: list = field(default_factory=list)

print(Item("Pen", 10))
print(Item("Pen", 10) == Item("Pen", 10))

# Item(name='Pen', price=10, tags=[])
# True

Wskazówka: Nie wszystko wymaga klasy. Jeśli nie ma stanu i ma tylko jedno zachowanie, zwykła funkcja jest prostsza. Do prostych wyszukiwań może wystarczyć słownik. Sięgnij po klasę, w której dane i zasady je chroniące wyraźnie pasują do siebie.

Typowe błędy

Używanie modyfikowalnego atrybutu klasy

To klasyczny błąd. Lista jest zdefiniowana w klasie, więc wszystkie wózki ją udostępniają:

class Cart:
    items = []            # shared by every cart!

    def add(self, item):
        self.items.append(item)

c1, c2 = Cart(), Cart()
c1.add("pen")
print(c2.items)

# ['pen']

Utwórz go w __init__ za pomocą self.items = [], aby każdy obiekt otrzymał własną listę.

Inne typowe błędy

  • Zapominanie self. Wpisz self.balance, a nie balance, metody wewnętrzne.
  • Zapominanie super().__init__(). Dziecko wówczas pomija atrybuty ustawione przez rodzica.
  • Budowanie ogromnych klas. Trudno przetestować klasę, która robi wszystko. Podziel to według odpowiedzialności.
  • Głębokie dziedziczenie. Dwa poziomy zwykle wystarczą, a kompozycja jest często wyraźniejsza.
  • Nie piszę testów. Zajęcia z regułami są łatwe do przetestowania, jak pokazuje nasz samouczek dotyczący testów Pythona przy użyciu małego wózka.

Podsumowanie

Python zorientowany obiektowo sprowadza się do grupowania danych według zachowania, które je chroni. Zacznij od __init__, metod i __str__, a następnie dodaj dziedziczenie i właściwości, gdy trafisz na problem, który rozwiązują. Następnym krokiem będzie skrypt przekazujący wszędzie te same zmienne i zamień je w jedną małą klasę.

Najczęstsze pytania

Jaka jest różnica między klasą a obiektem?

Klasa to definicja lub plan. Obiekt to konkretna instancja utworzona z niego, posiadająca własne dane. Jedna klasa może stworzyć wiele obiektów.

Co robi __init__ w Pythonie?

Jest to inicjator, który działa automatycznie podczas tworzenia obiektu. Zwykle ustawia początkowe atrybuty obiektu na podstawie przekazanych argumentów.

Czym jest self w Pythonie?

self odnosi się do obiektu, dla którego wywoływana jest metoda. Python przekazuje go automatycznie i pozwala metodzie odczytać i zmienić atrybuty obiektu.

Jakie są cztery filary OOP?

Są to enkapsulacja, abstrakcja, dziedziczenie i polimorfizm. Razem pomagają łączyć dane z zachowaniem, ukrywać szczegóły i ponownie wykorzystywać kod.

Kiedy powinienem używać klasy zamiast funkcji?

Użyj klasy, gdy dane i zachowanie należą do siebie w kilku operacjach. W przypadku jednej operacji bezstanowej zwykła funkcja jest prostsza i łatwiejsza do przetestowania.

Ucz się dalej

Pracuj z Stack Quora

Potrzebujesz pomocy przy testowaniu, WordPressie lub SEO?

Pomagamy zespołom dostarczać lepsze oprogramowanie i rozwijać ich witryny. Powiedz nam, nad czym pracujesz, a my zaproponujemy jasny następny krok.

Czytaj dalej

Więcej poradników na testowanie, sztuczna inteligencja i nowoczesny rozwój

Podobał Ci się ten artykuł? Wybierz temat i przejdź bezpośrednio do naszych najnowszych tutoriali.

Sztuczna inteligencja

Wyjaśnienie halucynacji AI: dlaczego modele językowe tworzą rzeczy i jak je zmniejszyć

Wyjaśniono halucynacje AI: czym są, dlaczego powstają w modelach językowych, typowe typy, jak je zredukować za pomocą uziemień i podpowiedzi oraz pr…

Przeczytaj artykuł →
DevOps

Wyjaśnienie zmiennych środowiskowych: pliki .env, sekrety i konfiguracja wykonana prawidłowo

Zmienne środowiskowe wyjaśnione na przykładach Pythona, które przeprowadziliśmy: ich odczytywanie i ustawianie, dlaczego każda wartość jest ciągiem …

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie ograniczenia szybkości interfejsu API: algorytmy, nagłówki i obsługa błędów 429

Ograniczanie szybkości API wyjaśnione za pomocą przeprowadzonej przez nas symulacji: zasobnik tokenów, stałe okno, przesuwane okno, 429 odpowiedzi, …

Przeczytaj artykuł →
Automatyzacja testów

Wyśmiewanie w Pythonie: unittest.mock, patch i błędy, które sprawiają, że testy kłamią

Wyśmiewanie w Pythonie za pomocą unittest.mock, przetestowane: Mock i zwracana wartość, efekt uboczny, łatanie tam, gdzie używana jest nazwa, specyf…

Przeczytaj artykuł →
Testowanie oprogramowania

Wyjaśnienie zasięgu kodu: pokrycie linii i oddziału oraz co naprawdę oznacza 100%

Wyjaśnienie pokrycia kodu za pomocą prawdziwego pliku cover.py: pokrycie linii, gałęzi i warunków, przeczytanie raportu, dlaczego 100% pokrycia może…

Przeczytaj artykuł →
Bazy danych i SQL

DELETE vs TRUNCATE vs DROP w SQL: różnice, wycofywanie i kiedy używać każdego z nich

DELETE vs TRUNCATE vs DROP wyjaśnione za pomocą przetestowanego SQL: co każdy usuwa, wycofywanie, wyzwalacze, resetowanie tożsamości, prędkość i czy…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie widoków SQL: tworzenie, używanie i unikanie pułapek wraz z przykładami

Widoki SQL wyjaśnione za pomocą zapytań, które uruchomiliśmy: tworzenie widoku, wyniki na żywo, ukrywanie kolumn, wydajność, widoki z możliwością ak…

Przeczytaj artykuł →
Tworzenie oprogramowania

Interfejs TypeScript a typ: rzeczywiste różnice, testowane za pomocą kompilatora

Interfejs TypeScript a typ, sprawdzony z prawdziwym kompilatorem: co oba mogą zrobić, co tylko jeden, łączenie deklaracji, rozszerzenia a przecięcia…

Przeczytaj artykuł →
Tworzenie oprogramowania

Python *args i **kwargs wyjaśnione: elastyczne funkcje z przejrzystymi przykładami

Python *args i **kwargs wyjaśnione za pomocą uruchomionego przez nas kodu: pakowanie i rozpakowywanie, kolejność parametrów, argumenty zawierające t…

Przeczytaj artykuł →
Tworzenie oprogramowania

Funkcje Lambda w Pythonie: składnia, rzeczywiste zastosowania i kiedy ich nie używać

Funkcje lambda w Pythonie wyjaśnione za pomocą uruchomionego przez nas kodu: składnia, sortowanie za pomocą klucza, mapa i filtr, domknięcia, pułapk…

Przeczytaj artykuł →
Sztuczna inteligencja

Kim są agenci AI? Jak one działają, dzięki prostej pętli agenta, którą możesz uruchomić

Kim są agenci AI? Prosty przewodnik po pętli agenta, narzędziach, pamięci i poręczach, z małą pętlą w Pythonie, którą uruchomiliśmy, prawdziwymi zag…

Przeczytaj artykuł →
DevOps

Monitorowanie a obserwowalność: prawdziwa różnica z logami, wskaźnikami i śladami

Wyjaśnienie monitorowania a obserwowalności: znane i nieznane awarie, dzienniki, metryki i ślady, opis incydentu przy kasie, złote sygnały, OpenTele…

Przeczytaj artykuł →
DevOps

Woluminy platformy Docker a mocowania powiązań: utrwalanie danych kontenera we właściwy sposób

Wyjaśniono woluminy Dockera a montowanie powiązań: dlaczego dane kontenera znikają, nazwane woluminy, montowanie powiązań, tmpfs, przykłady tworzeni…

Przeczytaj artykuł →
Automatyzacja testów

TDD vs BDD: kluczowe różnice, jedna funkcja zbudowana w obie strony i kiedy używać każdej z nich

TDD vs BDD wyjaśnione za pomocą jednej funkcji rabatowej zbudowanej w obie strony: refaktoryzacja czerwono-zielona z uruchomionym przez nas kodem, s…

Przeczytaj artykuł →
Testowanie oprogramowania

Testowanie akceptacyjne użytkownika (UAT): proces, lista kontrolna i rzeczywiste przykłady

Wyjaśniono testy akceptacyjne użytkownika: kto je przeprowadza, czym różni się od kontroli jakości, siedmioetapowy proces, szablon przypadku testowe…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie wartości SQL NULL: IS NULL, COALESCE, NULLIF i pułapki, których należy unikać

Wartości SQL NULL wyjaśnione za pomocą zapytań, które wykonaliśmy: logika trójwartościowa, IS NULL, COALESCE, NULLIF, w jaki sposób agregacje, łącze…

Przeczytaj artykuł →
Bazy danych i SQL

Instrukcja SQL CASE WHEN: składnia, rzeczywiste przykłady i typowe błędy

SQL CASE WHEN wyjaśnione za pomocą zapytań, które uruchomiliśmy: proste i przeszukiwane formularze, kolejność warunków, elementy przestawne z SUM, s…

Przeczytaj artykuł →
Tworzenie oprogramowania

Co to jest JWT? Tokeny internetowe JSON wyjaśnione na przykładzie działania

Co to jest JWT? Wyjaśniono tokeny sieciowe JSON: trzy części, token zbudowany i zmodyfikowany w uruchomionym przez nas kodzie, JWT a sesje, pamięć m…

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie pętli zdarzeń JavaScript: stos wywołań, mikrozadania i liczniki czasu z przykładami

Pętla zdarzeń JavaScript wyjaśniona za pomocą uruchomionego przez nas kodu: stos wywołań, kolejki zadań i mikrozadań, dlaczego setTimeout 0 nie jest…

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie generatorów Pythona i wydajności: oszczędzaj pamięć dzięki prawdziwym przykładom

Generatory Pythona i wydajność wyjaśnione za pomocą uruchomionego przez nas kodu: sposób wstrzymywania i wznawiania, mierzone oszczędności pamięci, …

Przeczytaj artykuł →
Sztuczna inteligencja

Czym są osady? Wyjaśnienie wektorów i podobieństwa cosinusa

Czym są osadzania? Prosty przewodnik po wektorach, podobieństwie cosinusów i wyszukiwaniu semantycznym, z małym przykładem, który przeprowadziliśmy,…

Przeczytaj artykuł →
DevOps

Wdrożenie niebiesko-zielone a kanaryjskie: różnice, kompromisy i sposób wyboru

Wyjaśniono wdrożenie Blue-Green vs Canary: sposób działania każdego z nich, koszty, ryzyko i wycofywanie zmian, przetestowane przez nas stabilne łąc…

Przeczytaj artykuł →
Automatyzacja testów

Niestabilne testy: co je powoduje i jak je naprawić na dobre

Niestabilne testy wyjaśnione w przeprowadzonych przez nas demonstracjach: główne przyczyny, sposób potwierdzenia i zdiagnozowania jednej z nich, odp…

Przeczytaj artykuł →
Testowanie oprogramowania

Load Testing vs Stress Testing: Differences, Metrics and k6 Examples

Wyjaśniono testy obciążenia i testy warunków skrajnych: co dowodzi każdy z nich, testy szczytowe i nasiąkania, istotne metryki, dlaczego średnie wpr…

Przeczytaj artykuł →
Testowanie oprogramowania

Przypadek testowy a scenariusz testowy: kluczowe różnice, przykłady i kiedy stosować każdy z nich

Wyjaśnienie przypadków testowych i scenariuszy testowych: jasne definicje, tabela obok siebie, jedna funkcja resetowania hasła zaczerpnięta ze scena…

Przeczytaj artykuł →
Bazy danych i SQL

Optymalizacja zapytań SQL: czytaj plany wykonania i napraw powolne zapytania z synchronizacją

Optymalizacja zapytań SQL przetestowana na milionie wierszy: przeczytaj plany wykonania, dodaj odpowiednie indeksy, napraw filtry niesargowalne, uży…

Przeczytaj artykuł →
Bazy danych i SQL

SQL UNION vs UNION ALL: różnice, przykłady i testowana wydajność

SQL UNION vs UNION ALL wyjaśnione na podstawie zapytań, które uruchomiliśmy: duplikaty, obie reguły są zgodne, prawdziwy błąd danych, zmierzona wyda…

Przeczytaj artykuł →
Tworzenie oprogramowania

Samouczek API pobierania JavaScript: GET, POST, obsługa błędów i limity czasu

Samouczek JavaScript Fetch API testowany na serwerze lokalnym: GET i POST, dlaczego 404 nie rzuca, pomocnik wielokrotnego użytku, ciągi zapytań, prz…

Przeczytaj artykuł →
Tworzenie oprogramowania

Obsługa plików w Pythonie: odczyt, zapis, CSV, JSON i pathlib z przykładami

Obsługa plików w Pythonie wyjaśniona za pomocą uruchomionego przez nas kodu: tryby otwarte, czytanie dużych plików, CSV, JSON, pathlib, pliki binarn…

Przeczytaj artykuł →
Tworzenie oprogramowania

Klasy i obiekty Pythona: samouczek OOP z prawdziwymi przykładami

Klasy i obiekty Pythona objaśnione za pomocą uruchomionego przez nas kodu: __init__, metody, atrybuty klas i instancji, dziedziczenie, właściwości, …

Przeczytaj artykuł →
Sztuczna inteligencja

Co to jest model dużego języka? Jak działają LLM, wyjaśnione bez szumu

Co to jest model dużego języka? LLM wyjaśnione prostym językiem: tokeny, osadzanie, uwaga, szkolenie, temperatura i okna kontekstowe, mała demonstra…

Przeczytaj artykuł →
DevOps

Polecenia systemu Linux dla początkujących: niezbędny przewodnik po terminalu z przykładami

Polecenia systemu Linux dla początkujących, pogrupowane według zadań: nawigacja, pliki, przeglądanie logów, grep, potoki, uprawnienia, procesy i arc…

Przeczytaj artykuł →
Automatyzacja testów

Selenium kontra dramaturg: kluczowe różnice, porównanie kodu i wybór

Porównanie Selenium i Playwright: architektura, oczekiwanie, obsługa przeglądarki i języka, debugowanie, ten sam test w obu narzędziach, porady doty…

Przeczytaj artykuł →
Testowanie oprogramowania

Partycjonowanie równoważne: technika projektowania testów wyjaśniona na praktycznych przykładach

Wyjaśniono podział równoważny: jak znaleźć prawidłowe i nieprawidłowe partycje, sprawdzone przykłady dla grup wiekowych, hasła i kupony, przeprowadz…

Przeczytaj artykuł →
Testowanie oprogramowania

Ważność a priorytet w testowaniu oprogramowania: różnice, macierz i rzeczywiste przykłady

Wyjaśniono ważność a priorytet w testowaniu oprogramowania: jasne definicje, czterokierunkowa macierz z przykładami, skale poziomów, kto ustawia każ…

Przeczytaj artykuł →
Bazy danych i SQL

Samouczek dotyczący podzapytań SQL: typy, skorelowane podzapytania i ISTNIEJĄ z przykładami

Samouczek dotyczący podzapytań SQL z zapytaniami, które wykonaliśmy: podzapytania skalarne, IN, FROM i SELECT, podzapytania skorelowane, EXISTS, puł…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie transakcji SQL i ACID: COMMIT, ROLLBACK i poziomy izolacji

Transakcje SQL i ACID wyjaśnione za pomocą wykonanego przez nas przelewu bankowego: COMMIT, ROLLBACK, punkty zapisu, blokady, poziomy izolacji, brud…

Przeczytaj artykuł →
Tworzenie oprogramowania

Git merge vs rebase: różnice, przykłady i kiedy czego używać

Git merge vs rebase wyjaśnione na prawdziwym wyniku logu, z tabelą porównawczą, złotą zasadą rebase i bezpiecznym procesem pracy zespołu.

Przeczytaj artykuł →
Tworzenie oprogramowania

Python list comprehension: składnia, przykłady i kiedy jej unikać

Python list comprehension wyjaśnione: składnia, filtrowanie, if-else, zagnieżdżone pętle, zmierzone czasy i sytuacje, w których zwykła pętla for jes…

Przeczytaj artykuł →
Bazy danych i SQL

SQL JOIN – wyjaśnienie z przykładami (Inner, Left, Right, Full)

Zrozum złączenia SQL krok po kroku na przykładowych tabelach i zapytaniach: INNER, LEFT, RIGHT, FULL, CROSS i SELF, plus typowe błędy i wskazówki wy…

Przeczytaj artykuł →