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=Truehace que las instancias sean inmutables.order=Trueañ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=Truebloquea la mutación y hace que las instancias admitan hash.- Utilice
replace()para crear copias modificadas. order=Truegenera 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
- Definir una dataclass
- Valores predeterminados y field()
- Opciones de inmutabilidad y comparación
- La biblioteca attrs