Dataclasses de Python

Las Dataclasses son clases de python, pero son adecuadas para almacenar objetos de datos. Este módulo proporciona un decorador y funciones para añadir automáticamente métodos especiales generados como __init__() y __repr__() a las clases definidas por el usuario.

Características

  1. Almacenan datos y representan un cierto tipo de dato. Ej: Un número. Para aquellos familiarizados con los ORM, una instancia de modelo es un objeto de datos. Representa un tipo específico de entidad. Contiene atributos que definen o representan la entidad.

  2. Se pueden comparar con otros objetos del mismo tipo. Ej: Un número puede ser mayor que, menor que, o igual a otro número.

Python 3.7 proporciona un decorador dataclass que se utiliza para convertir una clase en una dataclass.

class Number:
    def __init__(self, val):
        self.val = val

obj = Number(2)
obj.val
2

con dataclass

# Dataclass: genera automáticamente los métodos __init__ y __repr__
from dataclasses import dataclass

@dataclass  # El decorador convierte la clase en una dataclass
class Number:
    val: int  # Se requiere anotación de tipo

obj = Number(2)  # __init__ creado automáticamente
obj.val
2

Valores por defecto

Es fácil añadir valores por defecto a los campos de tu data class.

# Dataclass con valores por defecto: los campos con valores por defecto deben ir después de los campos requeridos
@dataclass
class Product:
    name: str        # Campo requerido
    count: int = 0   # Campo opcional con valor por defecto
    price: float = 0.0  # Campo opcional con valor por defecto

obj = Product("Python")  # Solo se requiere el nombre, los demás usan los valores por defecto
obj.name
Python
obj.count
0
obj.price
0.0
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

En una dataclass, ¿dónde deben colocarse los campos con valores por defecto?
A. Antes de los campos sin valores por defecto
B. Después de los campos sin valores por defecto
C. No importa
D. En una sección separada

Pistas de tipo (Type hints)

Es obligatorio definir el tipo de dato en la dataclass. Sin embargo, si prefieres no especificar el tipo de dato, usa typing.Any.

from dataclasses import dataclass
from typing import Any

@dataclass
class WithoutExplicitTypes:
   name: Any
   value: Any = 42

Enlaces relevantes