Contenido del capítulo

En este capítulo aprenderás lo que son las clases, como crearlas en Python y cuáles son las partes que las forman.

Duración estimada de todo el contenido:
Duración de vídeo:
Contiene 4 ejercicios de Python para resolver. Contiene 1 vídeo.
Tabla de contenidos
Logo

    ¿Qué es una clase?

    Una clase es una estructura de Python (y de muchos otros lenguajes de programación), que sirve para crear una plantilla generadora de objetos.

    Gracias al uso de clases, conseguiremos grandes ventajas.

    Clase en inglés se dice class.

    Las clases en Python - Parte 1
    Las clases en Python - Parte 1

    Espacio publicitario

    Sintaxis de una clase

    La sintaxis de una clase es muy sencilla; tan solo hay que declararla con la palabra reservada class, darle un nombre, y opcionalmente unos paréntesis.

    class NombreClase():

    Los paréntesis después del nombre de la clase son obligatorios solo si vas a utilizar la herencia de clases; tema que trataré en otro capítulo.

    Al ver los dos puntos en la declaración de la clase, podemos deducir en Python, que lo que viene a continuación es un bloque de código indentado, como ocurre con los condicionales, bucles y funciones:

    class NombreClase():
        # Bloque de código de la clase

    Convención de nombres CapWords

    Los nombres de las clases se escriben siguiendo la convención CapWords, (primera letra de cada palabra en letra mayúscula), y no en snake_case como la mayoría de nombres en Python.

    CapWords es la convención de nombres de clase que especifica la guía de estilo de Python (PEP 8).

    Esta especifica que los nombres de clase irán con cada primera letra de cada palabra que forme el nombre, en letra mayúscula.

    La guía de estilo tiene una infinidad de convenciones con las que escribir correctamente código Python, y se va actualizando con mucha frecuencia.

    CapWords es un nombre creado a partir de las palabras capital y words, que en español podemos traducir como “palabras” (words) “capitales” (caps).

    Palabras capitales significa palabras con la primera letra en mayúscula.

    El motivo principal de utilizar este método de escritura en clases, es para diferenciar a simple vista, lo que es el nombre de una clase, de lo que es el nombre, de por ejemplo, una variable o una función.

    En clases propias del lenguaje de Python, verás que se incumple esta norma especificada en la guía de estilo PEP 8.

    Por ejemplo, las clases int, float, list, dict, etc., son nombres de clase anteriores a esta convención, por eso, no la implementan, ya que realmente, sus nombres siguiendo esta convención, aplicada a posteriori, deberían escribirse como Int, Float, List, Dict, etc.

    Estos son tipos de datos básicos de Python que han sido parte del lenguaje desde sus primeras versiones. A lo largo de los años, Python ha mantenido la consistencia con los nombres de estos tipos básicos para no afectar a la compatibilidad con versiones anteriores.

    Espacio publicitario

    Caracteres admitidos

    En los nombres de clase se admiten los mismos caracteres que cualquier otro nombre de Python; solo utiliza letras, números y guiones bajos (_). Además, que el nombre de clase no empiece por un valor numérico.

    Ten en cuenta, que aunque sintácticamente hablando puedas utilizar los guiones bajos para los nombres de las clases, estarás incumpliendo la convención de nombres de clase CapWords, que no los utiliza.

    El uso de pass en clases

    Al igual que hacemos con los condicionales, bucles o funciones, podemos dejar una clase declarada, y “sin código” en su interior, utilizando la palabra reservada pass. Esto evitará un error por indentación (IndentationError).

    class NombreClase():
        pass

    El uso de pass en clases se suele emplear para definir primero el esquema general de las clases, y después ir implementando código en ellas.

    También es posible utilizar un comentario de tipo docstring, en lugar de utilizar la palabra reservada pass:

    class NombreClase():
        """Esta clase servirá para ..."""

    La palabra reservada pass, puede traducirse al español como pasar o dejar pasar.

    Aun teniendo una clase solo con pass, esta ya está lista para crear objetos a partir de ella. Así, también podemos ir definiendo objetos, antes de que ni siquiera tengan “vida” (código que haga algo con ellos).

    Partes de una clase

    En las clases contamos principalmente con dos elementos: atributos y métodos. Los atributos son variables que están dentro de una clase y los métodos son funciones que están dentro de una clase.

    Normalmente, el orden de declaración de estos elementos, es primero todos los atributos y luego los métodos. Este orden se suele llevar a cabo de esta forma, por una cuestión de organización en el código. En muchas ocasiones, daremos unos atributos a la clase, que serán accedidos múltiples veces por los métodos de esta. Entonces, lo lógico, suele ser colocar todos los atributos primero, y luego los métodos; no obstante, se trata simplemente de una buena práctica, no de una regla obligatoria.

    En inglés, atributo se dice attribute y método, method.

    Ejemplo de clase con atributos y métodos

    A continuación, puedes ver un ejemplo de una clase con dos atributos y dos métodos:

    # Declaración de clase
    class NombreClase():
        # Atributos de clase
        atributo_1 = "valor 1"
        atributo_2 = "valor 2"
    
        # Métodos
        def metodo_1(self):
            print("Método de clase")
        def metodo_2(self):
            print("Método de clase")

    Verás que los métodos cuentan con el parámetro especial llamado self; explicaré esto en otro capítulo.

    Espacio publicitario

    Las clases: moldes para objetos

    Las clases en Python - Parte 2
    Las clases en Python - Parte 2

    La programación orientada a objetos, está diseñada para moldear con código objetos del mundo real o imaginario.

    Imagina que estás desarrollando un videojuego con vehículos, o bien, si los videojuegos no son lo tuyo, que imagines un software (programa) de gestión empresarial para un concesionario, el cual tiene objetos de tipo vehiculo.

    Ahora que ya tenemos en la cabeza la imagen del objeto en cuestión, empecemos por el molde (clase), y seguiremos en otro capítulo por los objetos (producto del molde).

    Atributos y métodos de la clase

    Empecemos pensando en las cosas que podrían describir de forma general a un vehículo terrestre. Cosas como el color, la longitud o el número de ruedas. De forma general, todos los vehículos terrestres, cuentan con estas características. Entonces, son buenos atributos para una clase.

    Creando atributos en una clase

    Para crear atributos en una clase, lo haremos con las mismas normas que con las variables.

    Aquí tienes una clase que consta de tres atributos:

    # Se declara la clase vehiculo
    class Vehiculo():
        # Atributos
        color = None
        longitud_metros = None
        ruedas = 4

    En principio, con la clase estamos creando la plantilla general para distintos vehículos. Entonces, no quiero especificar un color todavía, así que lo dejo como valor None.

    None es un valor especial en Python, que significa “no hay valor”. Se puede usar para indicar que una variable no tiene un valor asignado, o para devolver un valor nulo, y evitar así el error por variable sin inicializar.

    Por la longitud, tampoco va a ser la misma para todos los vehículos, de forma que aplicamos también el valor None.

    Sin embargo, para los tipos de vehículos que me imagino, todos tendrán 4 ruedas, así que en este caso, sí que inicializo ese valor.

    Por lo tanto, tenemos un molde de objetos, que creará objetos de tipo Vehiculo, con estos tres valores por defecto.

    Creando métodos en una clase

    Después, sabemos que con los vehículos, podemos realizar ciertas acciones. Acciones típicas como arrancar el motor, o detenerlo.

    Aquí es donde entran en juego los métodos.

    Para crear métodos en una clase, escribiremos funciones con el parámetro especial self:

    # Se declara la clase vehiculo
    class Vehiculo():
        # Atributos
        color = None
        longitud_metros = None
        ruedas = 4
    
        # Métodos
        def arrancar(self):
            print("El motor ha arrancado.")
    
        def detener(self):
            print("El motor está detenido.")

    Muy pronto verás la finalidad de todos estos atributos y métodos. Primero tienes que ver como se crean los objetos, y se utilizan con ellos.

    En ocasiones, leerás o escucharás decir “miembros de una clase”. Esto se refiere al conjunto de elementos que la definen, los atributos y los métodos. Por ende, un atributo es un miembro de una clase, y un método, otro.

    Espacio publicitario

    Python y sus clases

    Los tipos de datos de Python, como son str, int, float, bool, list, tuple, etc. Son objetos generados a partir de sus respectivas clases. Por ejemplo, los objetos de tipo str, provienen de la class str.

    Es posible comprobarlo con la función predefinida type():

    print(type("Hola"))
    Resultado en la consola
    <class 'str'>

    La función predefinida type(), nos permite ver el tipo de dato al que corresponde un elemento pasado como argumento.

    La función predefinida type(), nos permite ver el tipo de dato al que corresponde un elemento pasado como argumento.

    Esta clase tiene métodos. Estos métodos nos permiten “hacer cosas” con los objetos, por ejemplo:

    texto = "Python: El poder de los objetos."
    print(type(texto))
    
    mayusculas = texto.upper()
    print(mayusculas)
    Resultado en la consola
    <class 'str'>
    PYTHON: EL PODER DE LOS OBJETOS.

    En este caso, he utilizado el método upper() de la clase str, para convertir el texto del objeto str a mayúsculas.

    Fíjate en el poder de los objetos, estos pueden llevar un montón de código, que ni siquiera está directamente escrito en la misma hoja de código Python.

    ¿Cuánto código nos ahorra este método ya escrito en la clase, en cada hoja .py que utilicemos, al no tener que escribir todo el código del método upper() en una función?

    Además de este método, la clase str contiene una gran cantidad de métodos, con los que hacer cosas por el estilo, por lo tanto, con un simple objeto tenemos acceso a un montón de código reutilizable.

    Espacio publicitario




    Espacio publicitario


    Ejercicios de Python para resolver

    1. Crea una clase con el nombre que quieras; estará vacía.

    Tan solo tenías que declarar la clase con pass, para poder dejarla vacía:

    class ClaseVacia():
        pass

    O bien, escribir en su lugar un comentario docstring:

    class ClaseVacia():
        """Comentario docstring"""

    Ten en cuenta, que el nombre debería respetar siempre la convención de nombres en CapWords.

    2. Modifica los siguientes nombres para que sean nombres de clase correctos, según la convención.

    • mi clase
    • usuario_premium
    • PRODUCTO-TIENDA

    Según la convención de nombres de clase de Python, los nombres deberían quedar así escritos:

    • MiClase
    • UsuarioPremium
    • ProductoTienda

    3. Crea una clase llamada Usuario, que tendrá los siguientes atributos y métodos (para los atributos, pon los valores que quieras):

    Atributos:

    • Nombre
    • Apellidos
    • Edad
    • Dirección
    • Teléfono

    Métodos:

    • Iniciar sesión
    • Cerrar sesión
    • Cambiar nombre de perfil

    Ten en cuenta, que para que funcione sin errores, deberás ajustar los nombres de los métodos y atributos, a las normas y convenciones de nombres de Python.

    Los métodos, al igual que las funciones normales, pueden estar “sin código” en su bloque.

    Puesto que, de momento, no tenemos nada que añadir, deberás ingeniar una forma de que no te dé error, por dejar métodos sin código, aunque también puedes poner un mensaje informativo, con un print(), en cada uno, si quieres hacerlo un poco más completo.

    No te olvides de añadir el parámetro self a cada método.

    La clase, según como te la he pedido, debería quedar así:

    class Usuario():
        # Atributos
        nombre = "Enrique"
        apellidos = "Barros Fernández"
        edad = 32
        direccion = "C/Universo n.º 71"
        telefono = "123456789"
    
        # Métodos
        def iniciar_sesion(self):
            print("Se inició la sesión.")
        def cerrar_sesion(self):
            print("Se cerró la sesión.")
        def cambiar_nombre_perfil(self):
            print("Se cambió el nombre de perfil.")

    Puede que en lugar de especificar un mensaje en los métodos, lo hayas dejado con pass, o con docstring.

    Si es tu caso, es correcto igualmente.

    4. En la siguiente clase, encuentra todos los fallos, ya sean de sintaxis o de convenciones:

    clase persona:
        nombre : "Lara"
        edad : 67
        telefono : "123456789"
    
        func saludar():
        print(f"¡Hola!")
    
        func caminar(self):
        pass

    La clase debería quedar de esta forma:

    class Persona:
        nombre = "Lara"
        edad = 67
        telefono = "123456789"
    
        def saludar(self):
            print(f"¡Hola!")
    
        def caminar(self):
            pass

    Por cierto, los paréntesis del nombre de la clase son opcionales. Solo son obligatorios si hay herencia de clases.

    Podría quedar así también:

    class Persona():

    O incluso así:

    class Persona(Object):

    Aunque esto último, es algo que todavía no te he explicado en esta parte del curso.

    La clase presentaba los siguientes fallos:

    • Palabra reservada class escrita en español.
    • El nombre persona, no cumple la convención de nombres de clase de Python.
    • El operador de asignación para los atributos no es (:).
    • Los métodos y las funciones se declaran con la palabra reservada def, no con la palabra func, que no existe en Python como palabra reservada.
    • Para evitar errores, todos los métodos deben llevar al menos el parámetro self.
    • Faltaba la sangría (indentación) de los bloques de código de los dos métodos.


    Espacio publicitario