Resumen

Los métodos de instancia en Python dan vida a los objetos: permiten consultar, validar y modificar su estado interno con precisión. Aquí verás cómo aplicar self, diseñar str, y crear métodos como prestar y devolver en una clase Libro con ISBN y campo booleano de disponibilidad, tal como se mostró al ejecutar python main.py con “Cien años de soledad” y “El Principito”.

¿Qué son los métodos de instancia y cómo usan self?

En Python, los métodos definidos dentro de una clase operan sobre cada instancia usando el parámetro self. Así, cada objeto puede interactuar con sus propios datos, como el campo booleano de disponibilidad.

  • self referencia la instancia actual: accede a atributos y modifica estado.
  • disponible como booleano: indica si el libro se puede prestar.
  • catálogo como lista: agrupa varios libros para iterar e imprimir sus datos con un for.

¿Cómo organizar el catálogo y el campo disponible?

  • Agrega el ISBN y el booleano disponible al inicializador.
  • Crea dos libros y añádelos a una lista catálogo.
  • Recorre con for e imprime cada libro.
class Libro:
    def __init__(self, titulo, autor, isbn, disponible=True):
        self.titulo = titulo
        self.autor = autor
        self.isbn = isbn
        self.disponible = disponible

# Ejemplo de uso
libro1 = Libro("Cien años de soledad", "Gabriel García Márquez", "978-0-06-088328-7")
libro2 = Libro("El Principito", "Antoine de Saint-Exupéry", "978-0-15-601219-5")

catalogo = [libro1, libro2]
for libro in catalogo:
    # Se mejorará con __str__ más adelante
    print(libro.titulo, libro.autor, libro.isbn, libro.disponible)

¿Cómo mejorar la salida con str y return?

El método especial str se ejecuta automáticamente al hacer print de un objeto. Debe usar self y siempre retornar un string con return. Sin return, aparece un error al imprimir el objeto.

class Libro:
    def __init__(self, titulo, autor, isbn, disponible=True):
        self.titulo = titulo
        self.autor = autor
        self.isbn = isbn
        self.disponible = disponible

    def __str__(self):
        # Retornar la representación escrita del libro
        return f"{self.titulo} - {self.autor} | ISBN: {self.isbn} | disponible: {self.disponible}"

print(libro1)  # Usa __str__ automáticamente

¿Qué fallos comunes evitar con f-strings?

  • Olvidar la letra “f” en el literal: el mensaje no interpolará variables.
  • No usar self dentro de str: produce errores o datos incorrectos.
  • Omitir return: no se imprime la representación del objeto.

¿Cómo implementar prestar y devolver y qué implica el reto “Es popular”?

Inicialmente, cambiar disponibilidad valida si el libro está disponible y lo pone en no disponible. Mejor aún, separar responsabilidades en dos métodos: prestar y devolver. Ambos usan self y retornan mensajes claros para entender qué ocurrió.

class Libro:
    def __init__(self, titulo, autor, isbn, disponible=True):
        self.titulo = titulo
        self.autor = autor
        self.isbn = isbn
        self.disponible = disponible

    def prestar(self):
        if self.disponible:
            self.disponible = False
            return f"{self.titulo}: prestado exitosamente."
        # (La lógica mostró el cambio cuando estaba disponible.)

    def devolver(self):
        self.disponible = True
        return f"{self.titulo}: ha sido devuelto y disponible nuevamente."

Ejemplo de uso y visualización de los mensajes con print y return:

miolibro = Libro("Cien años de soledad", "Gabriel García Márquez", "978-0-06-088328-7")
print(miolibro.prestar())   # "... prestado exitosamente"
print(miolibro.devolver())  # "... devuelto y disponible nuevamente"

¿Cómo abordar el método “Es popular” con un historial de préstamos?

El reto propone un método Es popular que retorne True si el libro fue prestado más de cinco veces. Para calcularlo, se debe guardar una lista de todos los libros prestados y contar las ocurrencias del libro objetivo.

# Lista global o compartida que registre cada préstamo
historial_prestamos = []

class Libro:
    def __init__(self, titulo, autor, isbn, disponible=True):
        self.titulo = titulo
        self.autor = autor
        self.isbn = isbn
        self.disponible = disponible

    def prestar(self):
        if self.disponible:
            self.disponible = False
            historial_prestamos.append(self)
            return f"{self.titulo}: prestado exitosamente."

    def devolver(self):
        self.disponible = True
        return f"{self.titulo}: ha sido devuelto y disponible nuevamente."

    def es_popular(self):
        return historial_prestamos.count(self) > 5

¿Te gustaría compartir cómo diseñarías el historial de préstamos o qué formato de impresión te resulta más claro con str?