Clases

A medida que los programas crecen en tamaño y complejidad, gestionar y organizar el código puede volverse bastante desafiante. Las funciones y variables pueden estar dispersas en diferentes partes de un programa, lo que dificulta el seguimiento de lo que está sucediendo y conduce a un código desordenado y difícil de mantener. Aquí es donde entran en juego las clases, una piedra angular de la programación orientada a objetos.
💡
Las clases son una forma de agrupar datos y funciones relacionados, creando lo que llamamos 'objetos'. Las clases son los conceptos fundamentales en la programación orientada a objetos (POO).
Las clases son como planos para crear objetos en nuestro código. Cada clase encapsula propiedades relacionadas (datos) y métodos (funciones) en unidades individuales. Por ejemplo, en un programa de juegos, podrías tener clases como Player, Monster o Item, cada una conteniendo sus propios datos y métodos relevantes. Esto facilita la comprensión y gestión de bases de código grandes, ya que las funcionalidades relacionadas están agrupadas y queda claro cómo interactúan entre sí.
Supongamos que deseas crear un software para modelar una biblioteca. Podrías tener libros en tu biblioteca, por lo que necesitarás crear una clase Book:
class Book:
    def __init__(self, title, author, pages):
        self.title = title     # Asigna el título a la instancia del libro
        self.author = author   # Asigna el autor a la instancia del libro
        self.pages = pages     # Asigna el número de páginas a la instancia del libro
La palabra clave class introduce una nueva clase, seguida de su nombre (Book). La línea def __init__(self, title, author, pages): define el estado inicial de la clase o el constructor. Aquí es donde se inicializa el objeto. self se refiere a la instancia de la clase. title, author y pages son atributos de la clase.
Puedes crear un nuevo objeto libro llamando a la clase como una función:
# Crea una nueva instancia de Book
mockingbird = Book('To Kill a Mockingbird', 'Harper Lee', 281)

print(mockingbird.title)   # To Kill a Mockingbird
print(mockingbird.author)  # Harper Lee
print(mockingbird.pages)   # 281
Observa que pasamos To Kill a Mockingbird, Harper Lee y 281 como argumentos. Esos se pasan como argumentos al método __init__ (casi como una función normal).
Podemos crear varias instancias de la clase Book:
# crear más instancias de Book
book2 = Book('1984', 'George Orwell', 328)
book3 = Book('The Great Gatsby', author='F. Scott Fitzgerald', pages=180)
book4 = Book('Moby Dick', 'Herman Melville', pages=720)

# imprimir información sobre los libros
print(f'{book2.title} by {book2.author} has {book2.pages} pages.')  # 1984 by George Orwell has 328 pages.
print(f'{book3.title} by {book3.author} has {book3.pages} pages.')  # The Great Gatsby by F. Scott Fitzgerald has 180 pages.
print(f'{book4.title} by {book4.author} has {book4.pages} pages.')  # Moby Dick by Herman Melville has 720 pages.
Al igual que con las funciones, podemos pasar argumentos tanto posicionales como nombrados al método __init__.
Además de datos, las clases también pueden encapsular funcionalidad. Supongamos que, en nuestro sistema de biblioteca, queremos marcar un libro como leído. Podemos definir un método en nuestra clase Book para este propósito:
class Book:
    def __init__(self, title, author, pages):
        self.title = title     # Asigna el título a la instancia del libro
        self.author = author   # Asigna el autor a la instancia del libro
        self.pages = pages     # Asigna el número de páginas a la instancia del libro
        self.is_read = False   # El libro aún no ha sido leído

    def mark_as_read(self):    # Un método de clase
        self.is_read = True    # Marca el libro como leído


mockingbird = Book('To Kill a Mockingbird', 'Harper Lee', 281)
print(mockingbird.is_read)   # False, el libro aún no ha sido leído
mockingbird.mark_as_read()   # Marca el libro como leído
print(mockingbird.is_read)   # True, el libro ha sido leído
El método mark_as_read cambia el estado del atributo is_read a True. Podemos llamar a este método en cualquier instancia de la clase libro. Esto demuestra cómo podemos agrupar datos y funcionalidades relacionadas utilizando clases en Python.
💡
En Python, self es un nombre convencional para el primer parámetro en los métodos de instancia de una clase. Es una referencia a la instancia actual de la clase. self se utiliza para acceder a los atributos y métodos de la clase dentro de su definición. Cuando creas un nuevo objeto de la clase, Python automáticamente enlaza el argumento self a ese nuevo objeto, por lo que no pasas self cuando llamas a un método de instancia. Aunque self no es una palabra reservada en Python, es ampliamente utilizado debido al estilo claro y legible que fomenta. Es importante notar que podrías usar cualquier otro nombre, pero usar self es fuertemente recomendado por la comunidad y se considera una buena práctica.

Desafío: Crea una Clase Car

Se te ha encomendado crear una clase Car que debe tener los siguientes atributos:
  • color (el color del coche)
  • make (la marca del coche)
  • model (modelo específico del coche)
  • year (el año en que se fabricó)
Estos atributos deben inicializarse en el método __init__ de la clase.
Además, la clase Car debe tener un método display_details. Este método debe devolver una representación en cadena de los detalles del coche en el formato [year] [color] [make] [model].
Input
Output
c = Car('red', 'Ferrari', 'F8', 2023); print(c.display_details())
2023 red Ferrari F8
c = Car('black', 'Tesla', 'Model S', 2021); print(c.display_details())
2021 black Tesla Model S
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue