0Pricing
Python Academy · Lekcja

Metody magiczne: __str__ i __repr__

Proszę implementować metody dunder, aby uzyskać czytelne reprezentacje obiektów.

Metody magiczne: __str__ i __repr__ to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Czym są metody magiczne?

Metody magiczne (dunder) to specjalne metody z podwójnymi znakami podkreślenia, które Python wywołuje w określonych sytuacjach, na przykład podczas wyświetlania lub porównywania.

class Foo:
    def __str__(self):
        return "I am Foo"

f = Foo()
print(f)        # I am Foo
print(str(f))   # I am Foo

__repr__: reprezentacja dla programisty

__repr__ powinno zwracać jednoznaczny tekst, który w idealnym przypadku pozwala odtworzyć obiekt. Jest wyświetlany w REPL i używany przez repr().

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"Point({self.x}, {self.y})"

p = Point(3, 4)
print(repr(p))  # Point(3, 4)

__str__: reprezentacja dla użytkownika

__str__ zwraca tekst przyjazny dla człowieka. Wywołują go print() i str(). Jeśli go nie ma, Python używa w zamian __repr__.

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

    def __str__(self):
        return f"{self.celsius}°C"

    def __repr__(self):
        return f"Temperature({self.celsius})"

t = Temperature(100)
print(t)        # 100°C
print(repr(t))  # Temperature(100)

Kiedy wywoływana jest każda z nich

__str__: print(), str(), f-stringi. __repr__: REPL, repr(), kontenery wyświetlające swoje elementy.

class Item:
    def __str__(self): return "str"
    def __repr__(self): return "repr"

x = Item()
print(x)         # str
print([x])       # [repr]  ← list uses repr for elements

__format__ do własnego formatowania

Zdefiniuj __format__, aby określić sposób wyświetlania obiektu w f-stringach ze specyfikacjami formatu.

class Money:
    def __init__(self, amount):
        self.amount = amount

    def __format__(self, spec):
        if spec == "usd":
            return f"${self.amount:.2f}"
        return str(self.amount)

m = Money(9.5)
print(f"{m:usd}")  # $9.50

__bool__ i wartości logiczne

__bool__ umożliwia ocenianie obiektu w kontekstach logicznych. Należy zwracać True albo False.

class Bag:
    def __init__(self, items):
        self.items = items

    def __bool__(self):
        return len(self.items) > 0

b = Bag([])
if not b:
    print("Bag is empty")  # Bag is empty

__len__ dla len()

__len__ sprawia, że działa len(obj). Jest również używana przez __bool__, gdy __bool__ nie została zdefiniowana.

class Stack:
    def __init__(self):
        self.data = []

    def push(self, v): self.data.append(v)

    def __len__(self):
        return len(self.data)

s = Stack()
s.push(1)
print(len(s))  # 1

__eq__ do sprawdzania równości

Zdefiniuj __eq__, aby określić, co oznacza równość dwóch instancji przy użyciu ==.

class Vector:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

print(Vector(1,2) == Vector(1,2))  # True

__hash__ w połączeniu z __eq__

Po zdefiniowaniu __eq__ Python ustawia __hash__ na None, przez co obiekt nie może być haszowany. Jeśli obiekt ma być używany w zbiorach lub słownikach, należy zdefiniować również __hash__.

class Point:
    def __init__(self, x, y): self.x, self.y = x, y
    def __eq__(self, o): return (self.x, self.y) == (o.x, o.y)
    def __hash__(self): return hash((self.x, self.y))

pts = {Point(1,2), Point(1,2)}
print(len(pts))  # 1

__add__ i działania arytmetyczne

Operatory arytmetyczne odpowiadają metodom dunder: __add__ operatorowi +, __sub__ operatorowi - itd.

class Vector:
    def __init__(self, x, y): self.x, self.y = x, y
    def __add__(self, o): return Vector(self.x+o.x, self.y+o.y)
    def __repr__(self): return f"Vector({self.x},{self.y})"

print(Vector(1,2) + Vector(3,4))  # Vector(4,6)

__getitem__ do indeksowania

__getitem__ umożliwia obsługę przez klasę indeksowania za pomocą nawiasów kwadratowych, na przykład obj[key].

class Matrix:
    def __init__(self, data):
        self.data = data

    def __getitem__(self, idx):
        return self.data[idx]

m = Matrix([[1,2],[3,4]])
print(m[0])     # [1, 2]
print(m[1][0])  # 3

Szybkie sprawdzenie

Jaka metoda dunder jest wywoływana podczas używania print(obj)?

Podsumowanie

Metody magiczne nadają klasom zachowanie charakterystyczne dla Pythona. __repr__ jest przeznaczona dla programistów, a __str__ dla użytkowników. Zdefiniowanie __eq__, __hash__ i dunderów operatorów arytmetycznych sprawia, że obiekty są w pełni funkcjonalne.

Często zadawane pytania

Czy lekcja „Metody magiczne: __str__ i __repr__” jest bezpłatna?

Tak — pełny tekst „Metody magiczne: __str__ i __repr__” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Metody magiczne: __str__ i __repr__”?

Proszę implementować metody dunder, aby uzyskać czytelne reprezentacje obiektów. Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Metody magiczne: __str__ i __repr__”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?

Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Klasy i metoda __init__
  2. Atrybuty instancji a atrybuty klasy
  3. Metody instancji i self
  4. Metody magiczne: __str__ i __repr__
← Powrót do Python Academy