Menu
Coddy logo textTech

Wprowadzenie do metod magicznych

Część sekcji Programowanie obiektowe ścieżki Python w Coddy. Lekcja 33 z 64.

Metody magiczne (nazywane też metodami dunder) to specjalne metody z podwójnymi znakami podkreślenia na początku i na końcu. Python wywołuje je automatycznie w odpowiedzi na określone operacje.

Oto przykład klasy z metodami magicznymi:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"

Metoda __init__ jest wywoływana automatycznie podczas tworzenia obiektu:

my_book = Book("Python Programming", "John Smith", 350)

Metoda __str__ jest wywoływana automatycznie, gdy konwertujesz obiekt na ciąg znaków:

print(my_book)        # Automatycznie wywołuje __str__
print(str(my_book))   # Również wywołuje __str__

Wynik:

Python Programming by John Smith
Python Programming by John Smith

Bez __str__ wyświetlenie obiektu pokazałoby jego lokalizację w pamięci:

class SimpleBook:
    def __init__(self, title):
        self.title = title

simple = SimpleBook("Test Book")
print(simple)  # <__main__.SimpleBook object at 0x...>

Dodaj kolejną magiczną metodę, która zwraca długość:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"
    
    def __len__(self):
        return self.pages

my_book = Book("Python Programming", "John Smith", 350)
print(len(my_book))   # Automatycznie wywołuje __len__

Wynik:

350

Najważniejsza informacja: Metody magiczne zaczynają się i kończą podwójnymi znakami podkreślenia (__method__) i są automatycznie wywoływane przez Python. Pozwalają Twoim obiektom współpracować z wbudowanymi funkcjami, takimi jak str(), len(), oraz operatorami, dzięki czemu Twoje klasy są bardziej zgodne z Pythonem i intuicyjne w użyciu.

challenge icon

Wyzwanie

Łatwy

W tym wyzwaniu zaimplementujesz klasę Counter z metodami magicznymi.

  • counter.py — to plik, który musisz edytować; zawiera komentarze TODO, które pomogą Ci w implementacji
  • driver.py — zawiera obszerne przypadki testowe

Implementuj klasę Counter w pliku counter.py oraz przypadki testowe w pliku driver.py, postępując zgodnie z komentarzami TODO. Klasa powinna obsługiwać inicjalizację z opcjonalnymi wartościami, reprezentację tekstową oraz operacje dodawania.

Spróbuj swoich sił

# TODO: Zaimportuj klasę Counter z counter.py
# Użyj formatu: from counter import Counter

# Kompleksowa obsługa przypadków testowych
test_case = input()

if test_case == "init_test":
    # TODO: Przetestuj inicjalizację z wartością domyślną
    # Utwórz licznik bez argumentów i go wyświetl
    # Oczekiwany wynik: "Count: 0"
    pass

elif test_case == "init_with_value":
    # TODO: Przetestuj inicjalizację z określoną wartością
    # Utwórz licznik z wartością początkową 10 i go wyświetl
    # Uwaga: print() niejawnie wywołuje __str__, ale tutaj skupiamy się na testowaniu __init__
    # Oczekiwany wynik: "Count: 10"
    pass


elif test_case == "addition":
    # TODO: Przetestuj operację dodawania
    # Utwórz licznik o wartości 3, dodaj do niego 7 i wyświetl wynik
    # Oczekiwany wynik: "Count: 10"
    pass

elif test_case == "chained_addition":
    # TODO: Przetestuj łańcuchowe operacje dodawania
    # Utwórz licznik o wartości 1, dodaj 2, następnie dodaj 3 do wyniku i go wypisz
    # Oczekiwany wynik: "Count: 6"
    pass

elif test_case == "negative_values":
    # TODO: Przetestuj wartości ujemne
    # Utwórz licznik o wartości -5 i go wypisz
    # Następnie dodaj do niego -3 i wypisz wynik
    # Oczekiwane wyniki: "Count: -5" i "Count: -8"
    pass

elif test_case == "zero_value":
    # TODO: Przetestuj wartości zerowe
    # Utwórz licznik o wartości 0, dodaj 0 i wypisz wynik
    # Oczekiwany wynik: "Count: 0"
    pass

elif test_case == "large_values":
    # TODO: Przetestuj duże wartości
    # Utwórz licznik o wartości 1000000 i dodaj 9000000
    # Oczekiwany wynik: "Count: 10000000"
    pass

elif test_case == "multiple_counters":
    # TODO: Przetestuj interakcję między wieloma licznikami
    # Utwórz counter1 o wartości 5 i counter2 o wartości 10
    # Wypisz oba liczniki
    # Oczekiwane wyniki: "Count: 5" i "Count: 10"
    pass

elif test_case == "type_validation":
    # TODO: Przetestuj dodawanie wartości różnych typów
    # Spróbuj dodać liczbę zmiennoprzecinkową (2.5) do licznika o wartości 5
    # Oczekiwany wynik: "Count: 7.5"
    pass
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Python online