__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).
Przykład
#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)])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
#class Nazwa:
def __str__(self):
return "opis dla użytkownika"
def __repr__(self):
return "Nazwa(...)"Więcej przykładów
#class Course:
def __init__(self, title):
self.title = title
print(Course("Python"))Wynik wygląda np. tak: <__main__.Course object at 0x104f3a2d0>. Adres w pamięci zmienia się przy każdym uruchomieniu.
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}")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})". @dataclassgeneruje__repr__automatycznie na podstawie pól klasy.
Powiązane hasła
#- str()Zamienia wartość na napis.
- print()Wypisuje wartości na standardowe wyjście, domyślnie w konsoli.
- f-stringiNapisy z wstawianymi wartościami wyrażeń: f"Masz {punkty} pkt".
- @dataclassDekorator, który na podstawie pól z adnotacjami typów generuje __init__, __repr__ i __eq__ klasy przechowującej dane.
- Metody specjalneMetody z podwójnymi podkreślnikami, dzięki którym obiekty działają z operatorami ==, <, +, in oraz z funkcją len().
Widzisz błąd albo brakuje przykładu? Napisz do nas.