Mejorando tu programación con Python. Las clases.

Soy consciente de que esto de las clases, y en concreto de las clases en Python, junto con los objetos, te puede resultar extraño. Y te puede resultar extraño sobre todo si no conoces nada de programación. Sin embargo, te puedo asegurar que esto es un gran invento que te ayudará a comprender la programación, pero que además te ayudará a programar mejor. Si ya las funciones, suponen un salto importante, el hecho de utilizar clases ya es un salto cualitativo. Así, en este vídeo, verás como vas mejorando tu programación con Python, a base de utilizar clases.

Mejorando tu programación con Python. Las clases.

Mejorando tu programación con Python. Las clases.

¿Que son las clases en Python?

Una clase en Python es una plantilla para crear objetos, y es una de las formas en que se pueden implementar programación orientada a objetos (POO) en Python. Las clases contienen atributos (datos o estado) y métodos (funciones o comportamiento) que se aplican a objetos específicos creados a partir de la clase.

Un objeto es una instancia de una clase en programación orientada a objetos (POO). Un objeto es una entidad única que tiene atributos (datos o estado) y métodos (funciones o comportamiento) que le permiten interactuar con otros objetos y realizar tareas específicas. Los objetos se crean a partir de clases y pueden ser modificados y manipulados de acuerdo con las reglas y características definidas por su clase. En resumen, un objeto es una representación concreta de una clase.

¿Que ventajas tienen las clases en Python?

Las clases en Python ofrecen varias ventajas, incluyendo:

  • Abstracción: las clases permiten encapsular y ocultar la complejidad detrás de una interfaz simplificada y fácil de usar.
  • Reutilización de código: los objetos pueden ser creados a partir de una misma clase, lo que permite reutilizar y compartir el código de la clase en diferentes partes de un programa.
  • Organización: las clases ayudan a organizar y estructurar el código de una manera lógica y coherente.
  • Mantenibilidad: las clases hacen que sea más fácil mantener y mejorar el código a medida que evoluciona un programa.
  • Programación orientada a objetos: las clases son la base de la programación orientada a objetos (POO), un paradigma de programación que se centra en la representación de los objetos y sus interacciones para resolver problemas y modelar sistemas complejos.

Y ¿cuales son los inconvenientes?

Pero no todo son ventajas, también te puedes encontrar algunos inconvenientes. Aunque las clases ofrecen muchas ventajas, también existen algunos inconvenientes, incluyendo:

  • Complejidad: las clases pueden ser más complejas y difíciles de entender para programadores principiantes o para aquellos que no están familiarizados con la programación orientada a objetos.
  • Overhead: el uso de clases puede requerir más tiempo y recursos que otras formas de programación, especialmente si se usan en exceso.
  • Dificultad para depurar: debido a la complejidad y la estructura de las clases, puede ser más difícil depurar y solucionar errores en el código.
  • Restricciones: el uso de clases puede ser más limitante que otras formas de programación y no siempre es la mejor opción para resolver todos los problemas.

Es importante tener en cuenta que estos inconvenientes dependen del contexto y la aplicación específicos, y que las clases siguen siendo una herramienta poderosa y ampliamente utilizada en la programación de Python y otros lenguajes de programación.

Un ejemplo de clase en Python

Un ejemplo de una clase en Python puede ser algo tan sencillo como lo que te muestro a continuación,

class Perro:
    def __init__(self, nombre, raza):
        self.nombre = nombre
        self.raza = breed

    def ladrar(self):
        print("Guau!")

perro = Perro("Niebla", "Mastín")
print(perro.nombre)
print(perro.raza)
perro.ladrar()

En este ejemplo, se define una clase llamada Perro que tiene dos atributos, nombre y raza, y un método, ladrar. Luego se crea un objeto perro a partir de esta clase y se accede a sus atributos y métodos.

Como ves, una clase en Python, generalmente consiste en las siguientes partes,

  • Nombre de la clase: es el nombre que se le da a la clase y que se usa para crear objetos a partir de ella.
  • __init__ método: es un método especial que se llama automáticamente cuando se crea un objeto a partir de una clase. Este método se usa para inicializar los atributos del objeto.
  • Atributos: son las variables o valores que definen el estado de un objeto.
  • Métodos: son las funciones que definen el comportamiento de un objeto y que permiten interactuar con otros objetos y realizar tareas específicas.

Estas son las partes principales de una clase en Python, aunque también existen otras partes como los métodos especiales, las propiedades, los métodos estáticos y las clases anidadas. Sin embargo, la estructura básica de una clase es la descrita anteriormente.

Los metodos especiales

Los métodos especiales en Python son métodos con nombres predefinidos que tienen un comportamiento especial y que se llaman automáticamente en situaciones específicas. Algunos de los métodos especiales más comunes en Python son:

  • __init__: se llama automáticamente cuando se crea un objeto a partir de una clase y se usa para inicializar los atributos del objeto.
  • __str__: se llama automáticamente cuando se intenta imprimir un objeto y se usa para devolver una representación en forma de cadena de texto del objeto.
  • __repr__: se llama automáticamente cuando se usa la función repr() en un objeto y se usa para devolver una representación en forma de cadena de texto que puede usarse para recrear el objeto.
  • __eq__: se llama automáticamente cuando se comparan dos objetos con el operador == y se usa para determinar si dos objetos son iguales.
  • __lt__: se llama automáticamente cuando se comparan dos objetos con el operador < y se usa para determinar si un objeto es menor que otro.
  • __del__: se llama automáticamente cuando un objeto es destruido o eliminado. Este método se puede usar para realizar tareas de limpieza, como cerrar archivos abiertos, liberar recursos, etc.
  • __add__: se llama automáticamente cuando se usa el operador + para sumar dos objetos y se usa para definir el comportamiento de la suma.
  • __len__: se llama automáticamente cuando se usa la función len() en un objeto y se usa para devolver la longitud o el tamaño del objeto.
  • __getitem__: se llama automáticamente cuando se accede a un elemento de un objeto usando corchetes [] y se usa para definir el comportamiento de indexación.
  • __setitem__: se llama automáticamente cuando se asigna un valor a un elemento de un objeto usando corchetes [] y se usa para definir el comportamiento de la asignación.
  • __iter__: se llama automáticamente cuando un objeto se usa en una sentencia for y se usa para definir el comportamiento de la iteración.
  • __call__: se llama automáticamente cuando un objeto se usa como una función y se usa para definir el comportamiento de la llamada.

Estos son solo algunos ejemplos de los métodos especiales en Python, pero existen muchos otros que se pueden usar para implementar comportamientos especiales en las clases.

Los context managers

Los context managers son una técnica en Python que permite garantizar que se realice una tarea de limpieza específica al final de un bloque de código. Se implementan mediante la utilización de objetos que implementan un método especial enter y un método exit.

Un objeto que implementa estos métodos se puede usar en una sentencia with para ejecutar código dentro de un contexto específico. Al finalizar el bloque de código, el método exit se llama automáticamente para realizar cualquier tarea de limpieza necesaria.

Esto es útil para garantizar que se realice una tarea de limpieza específica, como cerrar un archivo abierto, liberar recursos, etc., incluso si el bloque de código termina por una excepción.

Aquí hay un ejemplo de código que muestra cómo se puede usar un context manager:

with open('file.txt', 'r') as file:
    data = file.read()
    # processing code here

# file is automatically closed here

En este ejemplo, el objeto file es un archivo de texto que se abre en modo de lectura y se cierra automáticamente al final del bloque de código, sin importar si se produce una excepción o no.

Un ejemplo de un context manager sería el siguiente,

class OpenFile:
    def __init__(self, file_name, mode):
        self.file_name = file_name
        self.mode = mode

    def __enter__(self):
        self.file = open(self.file_name, self.mode)
        return self.file

    def __exit__(self, type, valor, traceback):
        self.file.close()

with OpenFile("sample.txt", "r") as f:
    data = f.read()
    print(data)

En este ejemplo, se define una clase llamada OpenFile que implementa los métodos __enter__ y __exit__. Luego, en la sentencia with, se crea un objeto de la clase OpenFile y se asigna a la variable f.

El método __enter__ abre el archivo de texto y devuelve una referencia al objeto del archivo, que se puede usar dentro del bloque de código. El método __exit__ se llama automáticamente al final del bloque de código y cierra el archivo. De esta manera, podemos estar seguros de que el archivo se cerrará automáticamente, independientemente de si se produce una excepción o no.

Las propiedades de un objeto

Las propiedades y los atributos son ambos valores asociados a un objeto, pero hay una diferencia importante entre ellos.

Los atributos son valores que se asignan directamente a un objeto. Por ejemplo:

class Persona:
    def __init__(self, nombre):
        self.nombre = nombre

persona = Persona("Pepito Péres")
print(persona.nombre) # Salida: Pepito Péres

En este ejemplo, la clase Persona define un atributo nombre que se asigna directamente al objeto persona.

Las propiedades, por otro lado, son un mecanismo para controlar y proteger el acceso a los atributos de un objeto. Por ejemplo:

class Persona:
    def __init__(self, nombre):
        self._nombre = nombre

    def get_nombre(self):
        return self._nombre

    def set_name(self, nombre):
        self._nombre = nombre

persona = Persona("Pedro Pérez")
print(persona.get_nombre()) # Output: Pedro Pérez
persona.set_nombre("Ana Pérez")
print(persona.get_nombre()) # Output: Ana Pérez

En este ejemplo, la clase Persona define un atributo _nombre y los métodos get_nombre y set_nombre para controlar el acceso a ese atributo. Al crear un objeto de la clase Person, no se puede acceder directamente al atributo _nombre, sino que se debe usar los métodos get_nombre y set_nombre.

La ventaja de las propiedades es que permiten proteger y controlar el acceso a los atributos de un objeto, lo que puede ser útil para garantizar la integridad de los datos y la consistencia de los objetos.

El vídeo

A continuación puedes encontrar el vídeo con todo lo que te he contado hasta aquí, pero en otro formato,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *