﻿class Ksiazka:
    """
    Klasa reprezentująca książkę w systemie bibliotecznym.
    Prezentuje różnice pomiędzy metodami __str__ oraz __repr__.
    """
    def __init__(self, tytul: str, autor: str, rok_wydania: int):
        self.tytul = tytul
        self.autor = autor
        self.rok_wydania = rok_wydania

    def __str__(self) -> str:
        """
        Zwraca czytelny, przyjazny dla użytkownika opis książki.
        Metoda ta jest używana domyślnie przez funkcję print() oraz str().
        """
        return f"{self.tytul} - {self.autor} ({self.rok_wydania})"

    def __repr__(self) -> str:
        """
        Zwraca oficjalną, techniczną reprezentację obiektu,
        przydatną dla programistów podczas debugowania.
        Dobrą praktyką jest, by zwracany łańcuch znaków przypominał 
        poprawny kod Pythona użyty do utworzenia obiektu (tzw. 'repr should look like code').
        """
        return f"Ksiazka(tytul='{self.tytul}', autor='{self.autor}', rok_wydania={self.rok_wydania})"

if __name__ == "__main__":
    # Tworzenie przykładowych obiektów
    k1 = Ksiazka("Wiedźmin", "Andrzej Sapkowski", 1990)
    k2 = Ksiazka("Solaris", "Stanisław Lem", 1961)

    print("--- Testowanie metody __str__ (print) ---")
    # print() niejawnie wywołuje metodę __str__
    print(k1)
    print(k2)

    print("\n--- Testowanie metody __repr__ (lista obiektów) ---")
    # Wypisywanie list używa metody __repr__ dla zawartych w niej elementów
    lista_ksiazek = [k1, k2]
    print(lista_ksiazek)

    print("\n--- Bezpośrednie wywołanie funkcji repr() i str() ---")
    print("str(k1):", str(k1))
    print("repr(k1):", repr(k1))
