0Pricing
Python Academy · Lección

Opciones de inmutabilidad y comparación

Cree dataclasses inmutables y ordenadas

Opciones de inmutabilidad y comparación es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Python Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Python Academy incluye 4 lecciones en total.

Opciones del decorador

El decorador @dataclass acepta argumentos de palabra clave que controlan los métodos que genera. Los más útiles son frozen y order.

  • frozen=True hace que las instancias sean inmutables.
  • order=True añade operadores de comparación.

Dataclasses inmutables

Con frozen=True, la clase generada impide asignar atributos después de la construcción. Cualquier intento genera un FrozenInstanceError.

from dataclasses import dataclass, FrozenInstanceError

@dataclass(frozen=True)
class Point:
    x: int
    y: int

p = Point(1, 2)
try:
    p.x = 99
except FrozenInstanceError as e:
    print('Cannot modify:', e)

Por qué es útil la inmutabilidad

Los objetos inmutables son más fáciles de comprender: su valor nunca cambia después de crearse, por lo que es seguro compartirlos entre funciones e hilos. También se pueden usar de forma segura como claves de diccionario y elementos de conjuntos.

Frozen significa hashable

Una dataclass congelada admite hash de forma predeterminada, por lo que puede utilizar sus instancias en conjuntos o como claves de diccionario. Las dataclasses mutables no admiten hash a menos que lo habilite explícitamente.

from dataclasses import dataclass

@dataclass(frozen=True)
class Point:
    x: int
    y: int

seen = {Point(0, 0), Point(1, 1), Point(0, 0)}
print(len(seen))

Reemplazar valores frozen

Como no puede modificar una instancia frozen, utilice dataclasses.replace() para crear una copia modificada. El original permanece intacto.

from dataclasses import dataclass, replace

@dataclass(frozen=True)
class Point:
    x: int
    y: int

p = Point(1, 2)
q = replace(p, y=99)
print(p)
print(q)

Dataclasses ordenadas

De forma predeterminada, una dataclass solo admite ==. Añada order=True para generar también <, <=, > y >=.

from dataclasses import dataclass

@dataclass(order=True)
class Version:
    major: int
    minor: int

print(Version(1, 2) < Version(1, 5))
print(Version(2, 0) > Version(1, 9))

Cómo se compara el orden

La ordenación compara los campos como una tupla, de izquierda a derecha, en el orden en que se declararon. El primer campo es el más significativo.

from dataclasses import dataclass

@dataclass(order=True)
class Version:
    major: int
    minor: int

# major compared first, then minor
print(Version(1, 9) < Version(2, 0))

Ordenar instancias de dataclass

Como las dataclasses ordenadas definen los operadores de comparación, puede ordenar directamente una lista de ellas con sorted().

from dataclasses import dataclass

@dataclass(order=True)
class Score:
    points: int
    name: str

data = [Score(50, 'B'), Score(90, 'A'), Score(70, 'C')]
for s in sorted(data):
    print(s)

Controlar la clave de ordenación

Para ordenar por algo distinto del orden natural de los campos, coloque primero un campo de ordenación oculto con field(init=False) y establézcalo en __post_init__. Puede excluir los demás campos de la comparación con compare=False.

from dataclasses import dataclass, field

@dataclass(order=True)
class Item:
    sort_index: int = field(init=False, repr=False)
    name: str = field(compare=False, default='')
    priority: int = 0

    def __post_init__(self):
        self.sort_index = self.priority

print(Item(name='b', priority=2) > Item(name='a', priority=1))

Combinar frozen y order

Puede combinar las opciones. Una dataclass frozen y ordenada es un tipo de valor inmutable y comparable perfecto, ideal para claves, números de versión o coordenadas.

from dataclasses import dataclass

@dataclass(frozen=True, order=True)
class SemVer:
    major: int
    minor: int
    patch: int

versions = {SemVer(1, 0, 0): 'stable'}
print(SemVer(1, 0, 0) < SemVer(1, 1, 0))
print(versions[SemVer(1, 0, 0)])

eq y el valor predeterminado

La opción eq controla si se genera __eq__. Su valor predeterminado es True. Tenga en cuenta que order=True requiere eq=True, ya que la ordenación se basa en la igualdad.

from dataclasses import dataclass

@dataclass(eq=True)
class Tag:
    name: str

print(Tag('x') == Tag('x'))
print(Tag('x') == Tag('y'))

Comprobación rápida

¿Qué ocurre si asigna un valor a un campo de una instancia de dataclass frozen?

Resumen

Ha aprendido a crear dataclasses inmutables y ordenadas.

  • frozen=True bloquea la mutación y hace que las instancias admitan hash.
  • Utilice replace() para crear copias modificadas.
  • order=True genera operadores de comparación que comparan los campos como una tupla.
  • Combine ambas opciones para crear tipos de valor sólidos.

Preguntas frecuentes

¿La lección «Opciones de inmutabilidad y comparación» es gratis?

Sí — el texto completo de «Opciones de inmutabilidad y comparación» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Python Academy, actualiza a CoddyKit PRO. El curso de Python Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Opciones de inmutabilidad y comparación»?

Cree dataclasses inmutables y ordenadas Practicas Python Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Python Academy?

No se requiere experiencia previa. Python Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Opciones de inmutabilidad y comparación»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Python Academy?

Sí. Cada lección de Python Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Definir una dataclass
  2. Valores predeterminados y field()
  3. Opciones de inmutabilidad y comparación
  4. La biblioteca attrs
← Volver a Python Academy