__str__() i __repr__()

Metody określające tekstowy wygląd obiektu: czytelny dla użytkownika (__str__) i techniczny dla programisty (__repr__).

Zwraca
Obie metody muszą zwracać napis (str).
Na tej stronie

Przykład

#
Python
class Student:
    def __init__(self, name, points):
        self.name = name
        self.points = points

    def __str__(self):
        return f"{self.name} ({self.points} pkt)"

    def __repr__(self):
        return f"Student({self.name!r}, {self.points})"

ania = Student("Ania", 250)

print(ania)
print(f"Lider: {ania}")
print(repr(ania))
print([ania, Student("Kuba", 90)])
Wynikzapisany wynik, możesz go sprawdzić
Ania (250 pkt)
Lider: Ania (250 pkt)
Student('Ania', 250)
[Student('Ania', 250), Student('Kuba', 90)]

Definicja i zastosowanie

#

Bez tych metod print(obiekt) pokazuje coś w rodzaju <__main__.Student object at 0x...>, co niewiele mówi. Metoda __str__ zwraca czytelny opis obiektu przeznaczony dla użytkownika. Korzystają z niej print(), str() i f-stringi.

Metoda __repr__ zwraca opis techniczny, przydatny przy szukaniu błędów. Dobra reprezentacja wygląda jak kod, który tworzy taki sam obiekt, np. Student("Ania", 250). Używa jej funkcja repr(), konsola interaktywna po wpisaniu nazwy zmiennej oraz wypisywanie kolekcji: lista obiektów w print() pokazuje repr każdego elementu.

Jeśli klasa ma tylko __repr__, Python użyje jej także zamiast brakującej __str__. Dlatego gdy piszesz tylko jedną z tych metod, zacznij od __repr__. W f-stringu wersję techniczną wymusisz przyrostkiem !r, np. f"{obiekt!r}". W samej metodzie __repr__ ten przyrostek dodaje cudzysłowy wokół napisów.

Składnia

#
Składnia
class Nazwa:
    def __str__(self):
        return "opis dla użytkownika"

    def __repr__(self):
        return "Nazwa(...)"

Więcej przykładów

#
Domyślny wygląd obiektu
Python
class Course:
    def __init__(self, title):
        self.title = title

print(Course("Python"))
Wynik
Kliknij Uruchom, żeby zobaczyć wynik.

Wynik wygląda np. tak: <__main__.Course object at 0x104f3a2d0>. Adres w pamięci zmienia się przy każdym uruchomieniu.

Samo __repr__ wystarczy za oba
Python
class Badge:
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return f"Badge({self.name!r})"

badge = Badge("Seria 7 dni")
print(badge)
print(str(badge) == repr(badge))
print(f"Zdobyto: {badge!r}")
Wynikzapisany wynik, możesz go sprawdzić
Badge('Seria 7 dni')
True
Zdobyto: Badge('Seria 7 dni')

Dobre praktyki

#
  • Jeśli piszesz tylko jedną z tych metod, wybierz __repr__. Posłuży też jako __str__, a bardzo pomaga przy szukaniu błędów.
  • W __repr__ formatuj napisy przez !r, żeby wynik zawierał cudzysłowy i wyglądał jak kod: f"Student({self.name!r})".
  • @dataclass generuje __repr__ automatycznie na podstawie pól klasy.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.