Cómo crear un objeto inmutable en Python

PythonPythonBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Python es un lenguaje de programación versátil que ofrece una amplia gama de características y herramientas, incluyendo la capacidad de crear objetos inmutables. En este tutorial, exploraremos el concepto de objetos inmutables en Python, cómo definirlos y cómo aprovechar sus beneficios en tu código.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python/BasicConceptsGroup -.-> python/variables_data_types("Variables and Data Types") python/BasicConceptsGroup -.-> python/numeric_types("Numeric Types") python/BasicConceptsGroup -.-> python/strings("Strings") python/BasicConceptsGroup -.-> python/booleans("Booleans") python/BasicConceptsGroup -.-> python/type_conversion("Type Conversion") subgraph Lab Skills python/variables_data_types -.-> lab-398168{{"Cómo crear un objeto inmutable en Python"}} python/numeric_types -.-> lab-398168{{"Cómo crear un objeto inmutable en Python"}} python/strings -.-> lab-398168{{"Cómo crear un objeto inmutable en Python"}} python/booleans -.-> lab-398168{{"Cómo crear un objeto inmutable en Python"}} python/type_conversion -.-> lab-398168{{"Cómo crear un objeto inmutable en Python"}} end

Comprendiendo los objetos inmutables

En Python, los objetos se pueden clasificar en dos categorías principales: mutables e inmutables. Los objetos mutables son aquellos que se pueden modificar después de ser creados, mientras que los objetos inmutables son aquellos que no se pueden cambiar una vez creados.

Los objetos inmutables son un concepto fundamental en la programación en Python, y comprenderlos es crucial para escribir código eficiente y confiable. Estos objetos se utilizan a menudo en situaciones en las que es necesario garantizar que los datos que representan permanezcan sin cambios durante toda la vida del programa.

Algunos ejemplos comunes de objetos inmutables en Python son:

  • Números (enteros, flotantes y números complejos)
  • Cadenas de texto (strings)
  • Tuplas
  • Conjuntos congelados (frozen sets)

Estos objetos tienen las siguientes características:

  1. Inmutables: Una vez que se crea un objeto inmutable, su valor no se puede modificar. Cualquier operación que parezca cambiar el objeto en realidad crea un nuevo objeto con el valor deseado.
  2. Seguros para subprocesos (thread-safe): Los objetos inmutables son intrínsecamente seguros para subprocesos, lo que significa que se pueden compartir de forma segura entre múltiples subprocesos sin riesgo de condiciones de carrera u otros problemas de concurrencia.
  3. Eficientes: Los objetos inmutables son generalmente más eficientes que los objetos mutables, ya que se pueden compartir y copiar fácilmente sin necesidad de crear nuevas copias de los datos.

Los objetos inmutables se utilizan ampliamente en Python, especialmente en situaciones en las que es necesario garantizar la integridad de los datos o en las que es necesario pasar datos entre funciones o módulos sin riesgo de modificaciones no deseadas.

## Example of an immutable object (integer)
x = 42
print(id(x))  ## Output: 140707600090368
x = x + 1
print(id(x))  ## Output: 140707600090400

En el ejemplo anterior, cuando sumamos 1 al entero x, se crea un nuevo objeto entero con el valor 43, y la variable x se reasigna a este nuevo objeto. El objeto original con el valor 42 no se modifica.

Comprender el concepto de objetos inmutables es esencial para escribir código Python eficiente y confiable. Al aprovechar las propiedades de los objetos inmutables, se puede garantizar la integridad de los datos y simplificar el código, lo que conduce a aplicaciones más mantenibles y robustas.

Definiendo objetos inmutables en Python

Tipos integrados inmutables

En Python, varios tipos integrados son intrínsecamente inmutables, incluyendo:

  1. Números (enteros, flotantes y números complejos)
  2. Cadenas de texto (strings)
  3. Tuplas
  4. Conjuntos congelados (frozen sets)

Estos tipos no se pueden modificar una vez creados. Cualquier operación que parezca cambiar el objeto en realidad crea un nuevo objeto con el valor deseado.

## Example: Immutable integer
x = 42
print(id(x))  ## Output: 140707600090368
x = x + 1
print(id(x))  ## Output: 140707600090400

Creando objetos inmutables personalizados

Si bien los tipos integrados de Python proporcionan un conjunto de objetos inmutables, también puedes crear tus propios objetos inmutables personalizados siguiendo estas pautas:

  1. Utiliza el atributo __slots__: Al definir el atributo __slots__ en tu clase, puedes limitar los atributos que se pueden agregar a una instancia de la clase, haciéndola efectivamente inmutable.
class ImmutablePoint:
    __slots__ = ('x', 'y')

    def __init__(self, x, y):
        self.x = x
        self.y = y
  1. Evita mutar atributos: Asegúrate de que tu clase no proporcione ningún método que pueda modificar el estado interno del objeto.
  2. Utiliza el decorador @property: Utiliza el decorador @property para crear propiedades de solo lectura, lo que puede ayudar a hacer cumplir la inmutabilidad de tu objeto.
class ImmutablePoint:
    def __init__(self, x, y):
        self._x = x
        self._y = y

    @property
    def x(self):
        return self._x

    @property
    def y(self):
        return self._y
  1. Implementa el método __hash__: Si deseas utilizar tu objeto inmutable como clave en un diccionario o como miembro de un conjunto, debes implementar el método __hash__ para garantizar que el objeto se pueda hashear.

Siguiendo estas pautas, puedes crear tus propios objetos inmutables personalizados en Python, lo que puede ser útil en una variedad de escenarios, como cuando necesitas garantizar la integridad de tus datos o cuando necesitas pasar datos entre funciones o módulos sin riesgo de modificaciones no deseadas.

Aprovechando los objetos inmutables

Los objetos inmutables en Python ofrecen varios beneficios que los hacen valiosos en una variedad de escenarios de programación. Exploremos algunas de las formas clave en las que puedes aprovechar los objetos inmutables en tus proyectos de Python.

Mejora del rendimiento y la eficiencia

Los objetos inmutables son generalmente más eficientes que los objetos mutables porque se pueden compartir y copiar fácilmente sin necesidad de crear nuevas copias de los datos. Esto puede conducir a una mejora del rendimiento, especialmente en escenarios en los que necesitas pasar datos entre funciones o módulos.

## Example: Efficient sharing of immutable objects
def process_data(data):
    ## Perform some operations on the data
    return data.upper()

data = "labex"
result = process_data(data)
print(result)  ## Output: LABEX

Concurrencia y seguridad en subprocesos (thread safety)

Los objetos inmutables son intrínsecamente seguros en subprocesos, lo que significa que se pueden compartir de forma segura entre múltiples subprocesos sin riesgo de condiciones de carrera u otros problemas de concurrencia. Esto los hace especialmente útiles en entornos de programación concurrente, donde es necesario garantizar la integridad de los datos.

## Example: Immutable objects in a multi-threaded environment
import threading

def worker(data):
    ## Perform some operations on the data
    return data.upper()

data = "labex"
threads = []
for _ in range(10):
    t = threading.Thread(target=worker, args=(data,))
    t.start()
    threads.append(t)

for t in threads:
    t.join()

Caché y memoización

Los objetos inmutables se pueden utilizar eficazmente para caché y memoización, donde se almacenan los resultados de cálculos costosos o llamadas a API para evitar repetir el mismo trabajo. Dado que los objetos inmutables no se pueden modificar, se pueden almacenar en caché de forma segura y reutilizar los resultados sin riesgo de cambios no deseados.

## Example: Memoization using immutable objects
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

## Memoize the fibonacci function
memo = {}
def memoized_fibonacci(n):
    if n in memo:
        return memo[n]
    result = fibonacci(n)
    memo[n] = result
    return result

print(memoized_fibonacci(100))  ## Output: 354224848179261915075

Al aprovechar las propiedades de los objetos inmutables, puedes escribir código Python más eficiente, seguro en subprocesos y mantenible. Dominar el uso de los objetos inmutables es una habilidad valiosa que puede ayudarte a convertirse en un programador de Python más competente.

Resumen

Dominar los objetos inmutables en Python es una habilidad valiosa para cualquier desarrollador. Al entender cómo crear y utilizar objetos inmutables, puedes escribir código más eficiente, confiable y seguro. Este tutorial ha proporcionado una visión general integral del tema, cubriendo los aspectos clave de los objetos inmutables en Python. Con el conocimiento adquirido, ahora puedes incorporar con confianza objetos inmutables en tus proyectos de Python y aprovechar sus propiedades únicas.