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 SmithBez __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:
350Najważ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.
Wyzwanie
ŁatwyW tym wyzwaniu zaimplementujesz klasę Counter z metodami magicznymi.
counter.py— to plik, który musisz edytować; zawiera komentarze TODO, które pomogą Ci w implementacjidriver.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"
passTa lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektyParametr selfMetodyAtrybutyMetoda konstruktora (__init__)Powtórzenie – prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaFunkcja super()Nadpisywanie metodDziedziczenie wielokrotneKolejność rozwiązywania metodPodsumowanie – hierarchia pracowników7Metody specjalne
Wprowadzenie do metod magicznychPrzeciążanie operatorówMagiczne metody kontenerówPowtórka – własna lista10Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy2Dekoratory
Wprowadzenie do dekoratorówDekorator propertyDekorator metody statycznejDekorator metody klasowej5Polimorfizm
Ponowne omówienie nadpisywania metodTypowanie kaczeKlasy i metody abstrakcyjneProjektowanie interfejsówPodsumowanie — kalkulator kształtów8Zaawansowane koncepcje programowania obiektowego
Kompozycja a dziedziczenieMiksyMetody statyczne i klasoweDekoratory klasMenedżery kontekstu11Wzorce projektowe, część 2
Wzorzec PolecenieWzorzec AdapterWzorzec DekoratorWzorzec Metoda szablonowaWzorzec StanWzorzec Kompozyt3Właściwości klas
Zmienne instancji a zmienne klasoweDekoratory właściwościAtrybuty prywatnePowtórzenie — menedżer kont bankowych6Hermetyzacja
Public, Protected, Private — pamięćModyfikatory dostępuUkrywanie informacjiDekoratory właściwości — zaawansowanePodsumowanie — system ewidencji uczniów12Projekt: System zarządzania biblioteką
Przegląd projektuKlasy Book i UserSystem wypożyczeńFunkcja wyszukiwaniaInterfejs administratoraTestowanie i integracjaPoćwicz samodzielnie: Kompilator Python online