Python

Clases y objetos en Python: modela problemas del mundo real

Aprende qué son las clases y los objetos en Python y cómo utilizarlos para representar problemas del mundo real. Comprende los atributos, métodos, __init__, self y las diferencias entre clases e instancias …

☰ Contenido de la guía ⌄
PYTHON · PROGRAMACIÓN ORIENTADA A OBJETOS

Aprender a programar también es aprender a representar el mundo

Imagina que necesitas desarrollar un programa para organizar una biblioteca, administrar productos de una tienda o registrar estudiantes de una institución.

Aunque estos problemas parecen diferentes, tienen algo en común: todos involucran entidades con características propias y acciones que pueden realizarse sobre ellas.

Un libro tiene un título, un autor y un estado de disponibilidad. Un producto tiene un precio y una cantidad disponible. Un estudiante tiene un nombre y puede matricularse en un curso.

La pregunta central

¿Cómo podemos representar estas entidades dentro de un programa sin perder de vista sus características, sus comportamientos y sus relaciones?

Una de las herramientas que tenemos para resolver este problema es la programación orientada a objetos, también conocida como POO.

Clases Objetos Atributos Métodos Python

En esta guía comprenderemos cómo funcionan las clases y los objetos en Python, por qué pueden ser útiles y cómo identificar situaciones donde tiene sentido utilizarlos.

Nuestro objetivo no será construir una aplicación completa, sino desarrollar una forma de pensar: identificar las entidades de un problema y representar sus datos y comportamientos mediante código.

Utilizaremos un libro como ejemplo principal. A partir de él aprenderemos los conceptos fundamentales sin necesidad de conocer previamente programación orientada a objetos.

COMPRENDER EL PROBLEMA

Los datos por sí solos no siempre cuentan toda la historia

En Python ya podemos representar información utilizando variables, listas, diccionarios y otras estructuras de datos.

Por ejemplo, para representar un libro podemos almacenar su título, su autor y si está disponible para préstamo.

CARACTERÍSTICAS ¿Qué información tiene un libro?

Un libro puede tener un título, un autor, un año de publicación y un estado que indique si está disponible.

COMPORTAMIENTOS ¿Qué operaciones necesitamos realizar?

Consultar sus datos, registrarlo como prestado, devolverlo o comprobar si está disponible.

Podemos resolver estas operaciones con diccionarios y funciones independientes. De hecho, para programas pequeños esa solución puede ser suficiente.

Sin embargo, cuando necesitamos manejar muchos libros y aplicar las mismas reglas a cada uno, puede resultar conveniente organizar los datos y las operaciones relacionadas mediante una estructura común.

Aquí aparece la programación orientada a objetos

Una clase nos permite definir una forma de representar entidades de un mismo tipo, reuniendo atributos y métodos relacionados.

Después podemos crear objetos concretos que mantengan su propia información.

¿Las clases reemplazan los diccionarios y las funciones?

No. Python permite combinar distintos estilos de programación. Podemos utilizar funciones, diccionarios y clases dentro de un mismo programa.

La elección depende de lo que necesitamos representar y de qué estructura hace que el código sea más comprensible.

La programación orientada a objetos no consiste en crear clases para todo, sino en organizar bien aquello que realmente necesita ser modelado.
EL CONCEPTO FUNDAMENTAL

Clase y objeto: el modelo y sus instancias

Para comprender las clases y los objetos, pensemos en una editorial que publica libros.

Todos los libros comparten ciertas características generales. Tienen un título, un autor y pueden encontrarse disponibles o prestados.

Pero no todos los libros contienen la misma información. Cada ejemplar concreto puede tener un título diferente, un autor diferente y su propio estado de disponibilidad.

CLASE El modelo Libro

Una clase describe una estructura común para representar libros. Define qué atributos y métodos tendrán los objetos creados a partir de ella.

En Python utilizaremos una clase llamada Libro.

OBJETO Un libro concreto

Un objeto es una instancia de una clase. Representa una entidad concreta que puede almacenar sus propios valores.

Podemos crear varios objetos de la clase Libro sin que todos tengan necesariamente los mismos datos.

Imaginemos dos libros diferentes

1
Definimos la clase Libro

Establecemos que los objetos tendrán atributos como título y autor, además de comportamientos como prestar y devolver.

2
Creamos el primer objeto

Un libro titulado "El principito", escrito por Antoine de Saint-Exupéry.

3
Creamos el segundo objeto

Otro libro titulado "Cien años de soledad", escrito por Gabriel García Márquez.

Ambos objetos pertenecen a la misma clase, pero cada uno conserva sus propios atributos de instancia.

La distinción esencial

La clase define cómo se organizan y comportan los objetos. Cada objeto es una instancia concreta creada a partir de esa clase.

La analogía de una clase como una plantilla es útil para comenzar, aunque una clase en Python también puede definir comportamientos, no solamente la estructura de los datos.

En la siguiente ilustración veremos cómo una sola clase puede dar lugar a dos objetos con características diferentes.

Diagrama de programación orientada a objetos en Python: la clase Libro permite crear dos objetos con títulos y autores diferentes.
Figura 1. La clase Libro define una estructura común; cada objeto creado a partir de ella conserva sus propios datos.
DEL CONCEPTO AL LENGUAJE

¿Cómo se representan las clases y los objetos en Python?

Hasta ahora hemos utilizado la idea de una clase como un modelo que permite representar entidades con características y comportamientos comunes.

Pero una clase no es solamente una idea teórica. En Python podemos definirla directamente mediante código.

Para ello utilizamos la palabra reservada class, seguida del nombre que queremos asignar a la clase.

DEFINICIÓN La clase

Es un objeto del lenguaje que permite definir atributos y métodos que estarán disponibles para sus instancias.

En nuestro ejemplo, la clase se llamará Libro.

INSTANCIACIÓN El objeto

Es una instancia concreta creada a partir de una clase.

Podemos crear tantos objetos Libro como necesitemos; cada uno tendrá su propia identidad.

Una misma clase, múltiples objetos

Imaginemos que una biblioteca necesita registrar cien libros.

No sería necesario escribir cien definiciones diferentes de la clase Libro.

Bastaría con definir la clase una vez y utilizarla para crear las distintas instancias.

Un concepto importante

Definir una clase y crear un objeto son dos operaciones diferentes.

La definición establece una estructura y un comportamiento. La instanciación crea un objeto concreto que puede utilizarse dentro del programa.

Ahora que entendemos la diferencia, vamos a escribir nuestra primera clase utilizando la sintaxis más sencilla posible.

Python
# Nuestra primera clase en Python

class Libro:
    pass


# Creamos dos objetos de la misma clase

libro_1 = Libro()
libro_2 = Libro()


# Comprobamos sus características

print("Clase:", type(libro_1).__name__)

print(
    "¿Es un objeto de la clase Libro?",
    isinstance(libro_1, Libro)
)

print(
    "¿Los dos nombres hacen referencia al mismo objeto?",
    libro_1 is libro_2
)
COMPRENDAMOS EL EJEMPLO

¿Qué acabamos de crear?

Nuestro primer ejemplo contiene una clase llamada Libro y dos objetos creados a partir de esa misma clase.

Aunque todavía no hemos definido atributos ni métodos propios, el programa ya nos permite observar varias características fundamentales de la programación orientada a objetos.

1
class Libro:

La palabra class indica que estamos definiendo una clase.

Libro es su nombre. Por convención, los nombres de las clases en Python utilizan palabras con inicial mayúscula.

2
pass

Es una instrucción que no realiza ninguna acción.

La utilizamos porque Python requiere un bloque de código después de definir la clase.

Más adelante reemplazaremos esta instrucción por código que describa nuestros libros.

3
libro_1 = Libro()

Al llamar a Libro(), Python crea una instancia de nuestra clase.

Guardamos la referencia a ese objeto en la variable libro_1.

4
libro_2 = Libro()

Creamos una segunda instancia.

Aunque pertenece a la misma clase, es un objeto diferente del que creamos anteriormente.

¿Qué resultados obtenemos?

TIPO DEL OBJETO Libro

type() permite consultar el tipo del objeto. __name__ devuelve el nombre de ese tipo.

COMPROBACIÓN DE INSTANCIA True

isinstance() confirma que libro_1 es una instancia de la clase Libro.

IDENTIDAD DE OBJETOS False

El operador is comprueba si dos referencias identifican exactamente el mismo objeto.

En este caso devuelve False porque creamos dos instancias diferentes.

¿Qué significa que sean independientes?

Dos objetos pueden pertenecer a la misma clase sin ser el mismo objeto.

Más adelante veremos que también pueden conservar valores diferentes en sus atributos de instancia.

Nuestra clase todavía es muy sencilla. Los objetos existen, pero aún no almacenan el título ni el autor.

Para incorporar esos datos conoceremos dos elementos fundamentales de Python: __init__ y self.

INICIALIZACIÓN DE OBJETOS

__init__ y self: cómo recibe sus datos cada objeto

Imaginemos que ahora queremos registrar el título y el autor de cada libro.

Necesitamos una forma de indicar esos valores cuando creamos cada nueva instancia.

Python permite hacerlo mediante un método especial llamado __init__.

¿Qué hace __init__?

__init__ es un método especial que permite inicializar el estado de un objeto después de que ha sido creado.

Cuando llamamos a una clase como Libro(), Python puede ejecutar automáticamente su método __init__ para asignar los valores iniciales de esa instancia.

Una precisión técnica

Aunque frecuentemente se llama constructor a __init__, su función específica es inicializar una instancia.

La creación del objeto y su inicialización son conceptos relacionados, pero no idénticos.

¿Y qué significa self?

self es el nombre que utilizamos por convención para referirnos a la instancia sobre la cual se está ejecutando un método.

Gracias a self, podemos guardar información dentro del objeto correspondiente.

Por ejemplo, cuando escribimos self.titulo, estamos accediendo al atributo titulo de esa instancia.

__init__ Inicializa el objeto

Permite establecer los valores iniciales de sus atributos.

Podemos recibir información mediante parámetros, como titulo y autor.

self Identifica la instancia

Permite trabajar con los atributos y métodos del objeto que está ejecutando una operación.

Es una convención de nombre, no una palabra reservada del lenguaje.

¿Qué ocurre al crear un libro?

1
Solicitamos una instancia

Llamamos a Libro() y proporcionamos los datos iniciales.

2
Python inicializa el objeto

El método __init__ recibe la instancia mediante self y los argumentos que proporcionamos.

3
Se guardan los atributos

Las asignaciones self.titulo y self.autor almacenan valores asociados a esa instancia.

__init__ define cómo inicializar una instancia; self permite trabajar con esa instancia.

Con estos conceptos ya podemos mejorar nuestra clase Libro para que represente libros con información concreta.

Python
# Clase Libro con atributos de instancia

class Libro:

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


# Creamos un libro con datos concretos

libro = Libro(
    "El principito",
    "Antoine de Saint-Exupéry"
)


# Consultamos sus atributos

print("Título:", libro.titulo)
print("Autor:", libro.autor)
print("Disponible:", libro.disponible)
Texto plano
Título: El principito
Autor: Antoine de Saint-Exupéry
Disponible: True
ATRIBUTOS EN PYTHON

Los atributos: la información que pertenece a cada objeto

En el ejemplo anterior mejoramos nuestra clase Libro para representar información de un libro concreto.

Ahora cada instancia puede almacenar su título, su autor y su estado de disponibilidad.

Estos valores se encuentran asociados a atributos de instancia.

ATRIBUTO 01 titulo

Representa el nombre del libro.

Lo asignamos mediante self.titulo.

ATRIBUTO 02 autor

Almacena el nombre de quien escribió la obra.

Lo asignamos mediante self.autor.

ATRIBUTO 03 disponible

Indica si el libro está disponible para préstamo.

Inicialmente utilizamos el valor booleano True.

¿Por qué escribimos self.titulo = titulo?

Aunque ambos nombres se parecen, representan cosas diferentes.

PARÁMETRO titulo

Es el nombre del parámetro que recibe __init__.

Contiene el valor proporcionado al crear la instancia.

ATRIBUTO self.titulo

Es un atributo asociado al objeto.

La asignación guarda allí el valor recibido.

Por eso, cuando posteriormente escribimos libro.titulo, podemos consultar el título guardado en ese objeto.

¿Todos los objetos comparten los mismos valores?

No necesariamente. Cada instancia puede almacenar sus propios valores de atributos.

Si creamos dos objetos Libro, el título de uno puede ser diferente del título del otro.

También podemos modificar un atributo de un objeto sin modificar automáticamente el atributo correspondiente de otra instancia.

Los objetos comparten la definición, no necesariamente sus datos

Dos instancias pueden utilizar la misma clase y los mismos métodos, pero conservar valores individuales en sus atributos.

Para comprobarlo, vamos a crear dos libros y modificar el estado de disponibilidad de uno de ellos.

Python
# Dos objetos creados a partir de la misma clase

class Libro:

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


# Primer objeto

libro_1 = Libro(
    "El principito",
    "Antoine de Saint-Exupéry"
)


# Segundo objeto

libro_2 = Libro(
    "Cien años de soledad",
    "Gabriel García Márquez"
)


# Cambiamos solo el segundo objeto

libro_2.disponible = False


# Consultamos sus datos

print("LIBRO 1")
print("Título:", libro_1.titulo)
print("Autor:", libro_1.autor)
print("Disponible:", libro_1.disponible)

print()

print("LIBRO 2")
print("Título:", libro_2.titulo)
print("Autor:", libro_2.autor)
print("Disponible:", libro_2.disponible)

print()

print(
    "¿Son el mismo objeto?",
    libro_1 is libro_2
)
Texto plano
LIBRO 1
Título: El principito
Autor: Antoine de Saint-Exupéry
Disponible: True

LIBRO 2
Título: Cien años de soledad
Autor: Gabriel García Márquez
Disponible: False

¿Son el mismo objeto? False
Dos instancias de la clase Libro en Python mantienen estados independientes: libro_1 está disponible y libro_2 no está disponible.
Figura 2. Modificar el atributo disponible de un objeto no cambia automáticamente el mismo atributo de otra instancia.
COMPORTAMIENTOS DE LOS OBJETOS

Los métodos: cuando un objeto puede realizar acciones

Hasta ahora hemos aprendido que un objeto puede almacenar información mediante atributos. Nuestro libro, por ejemplo, tiene un título, un autor y un estado de disponibilidad.

Pero representar una entidad no consiste solamente en describir sus características. También necesitamos expresar qué operaciones pueden realizarse sobre ella.

En programación orientada a objetos, estas operaciones suelen representarse mediante métodos.

ATRIBUTO ¿Qué información tiene?

El atributo disponible nos indica si un libro puede prestarse.

Ejemplo: libro.disponible

MÉTODO ¿Qué operación puede realizar?

El método prestar() puede cambiar el estado del libro cuando se realiza un préstamo.

Ejemplo: libro.prestar()

Los métodos también pueden contener reglas

Imaginemos que alguien solicita un libro. Si está disponible, podemos prestarlo y cambiar su estado a False.

Sin embargo, si ya está prestado, la operación debería indicar que no fue posible realizar otro préstamo.

Por eso, un método no se limita a cambiar un valor: también puede comprobar condiciones y decidir qué debe ocurrir.

La idea fundamental

Los atributos representan información asociada a un objeto. Los métodos representan operaciones que podemos realizar utilizando ese objeto.

Vamos a incorporar dos métodos a nuestra clase Libro: prestar() y devolver().

Python
class Libro:

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

    def prestar(self):
        if not self.disponible:
            return False

        self.disponible = False
        return True

    def devolver(self):
        if self.disponible:
            return False

        self.disponible = True
        return True


# Creamos un libro
libro = Libro(
    "El principito",
    "Antoine de Saint-Exupéry"
)

print("Disponible al inicio:", libro.disponible)

print("Primer préstamo:", libro.prestar())
print("Disponible después:", libro.disponible)

print("Segundo préstamo:", libro.prestar())

print("Devolución:", libro.devolver())
print("Disponible al final:", libro.disponible)
Texto plano
Disponible al inicio: True
Primer préstamo: True
Disponible después: False
Segundo préstamo: False
Devolución: True
Disponible al final: True
COMPRENDER EL COMPORTAMIENTO

¿Qué ocurre cuando prestamos y devolvemos un libro?

Nuestro ejemplo muestra que un objeto puede cambiar de estado durante la ejecución de un programa.

Al crearlo, el libro comienza con el atributo disponible establecido en True.

Cuando llamamos al método prestar(), comprobamos su disponibilidad y, si es posible realizar el préstamo, modificamos ese atributo.

1
Estado inicial: True

El libro está disponible. Todavía no hemos realizado ninguna operación sobre él.

2
Primer préstamo: correcto

prestar() devuelve True porque pudo realizar la operación. Después, disponible pasa a False.

3
Segundo préstamo: rechazado

Como el libro ya está prestado, prestar() devuelve False y conserva el estado actual.

4
Devolución: correcta

devolver() vuelve a establecer disponible en True. El libro puede prestarse otra vez.

El objeto mantiene su estado

No estamos creando un nuevo libro cada vez que realizamos un préstamo. Trabajamos con la misma instancia, pero sus atributos pueden cambiar.

Datos y comportamiento trabajando juntos

El atributo disponible describe una situación del objeto. Los métodos prestar() y devolver() permiten modificar esa situación siguiendo reglas definidas en la clase.

En este ejemplo, los métodos permiten expresar con claridad qué significa prestar o devolver un libro. Más adelante veremos que no todas las operaciones necesitan convertirse en métodos.

Estás viendo solo el 60% del contenido. Hazte Premium para acceder a la guía completa.

Comunidad

Comentarios y valoraciones

No hay comentarios aún. ¡Sé el primero en opinar!