Con PEP 557, las clases de datos se introducen en la biblioteca estándar de Python.
Utilizan el @dataclassdecorador y se supone que son "tuplas con nombre mutables con valor predeterminado", pero no estoy realmente seguro de entender lo que esto realmente significa y en qué se diferencian de las clases comunes.
¿Qué son exactamente las clases de datos de Python y cuándo es mejor usarlas?
python
class
python-3.7
python-dataclasses
rey juliano
fuente
fuente

namedtupleLos s son inmutables y no pueden tener valores predeterminados para los atributos, mientras que las clases de datos son mutables y pueden tenerlos.@dataclassno hará que el sitio se desintegre.namedtuplesPUEDE tener valores predeterminados. Eche un vistazo aquí: stackoverflow.com/questions/11351032/…Respuestas:
Las clases de datos son solo clases regulares que están orientadas a almacenar el estado, más que contener mucha lógica. Cada vez que crea una clase que consiste principalmente en atributos, crea una clase de datos.
Lo que hace el
dataclassesmódulo es facilitar la creación de clases de datos. Se encarga de una gran cantidad de placa de caldera para usted.Esto es especialmente importante cuando su clase de datos debe ser hashaable; Esto requiere un
__hash__método y un__eq__método. Si agrega un__repr__método personalizado para facilitar la depuración, eso puede volverse bastante detallado:Con
dataclassesusted puede reducirlo a:El mismo decorador clase también puede generar métodos de comparación (
__lt__,__gt__, etc.) y la inmutabilidad mango.namedtupleLas clases también son clases de datos, pero son inmutables por defecto (además de ser secuencias).dataclassesson mucho más flexibles a este respecto, y pueden estructurarse fácilmente de modo que puedan desempeñar el mismo papel que unanamedtupleclase .El PEP se inspiró en el
attrsproyecto , que puede hacer aún más (incluidos slots, validadores, convertidores, metadatos, etc.).Si desea ver algunos ejemplos, recientemente utilicé
dataclassesvarias de mis soluciones de Advent of Code , consulte las soluciones para el día 7 , día 8 , día 11 y día 20 .Si desea usar el
dataclassesmódulo en las versiones de Python <3.7, puede instalar el módulo con respaldo (requiere 3.6) o usar elattrsproyecto mencionado anteriormente.fuente
@dataclassgenera aproximadamente el mismo__init__método, con unquantity_on_handargumento de palabra clave con valor predeterminado. Cuando crea una instancia, establecerá elquantity_on_handatributo de instancia, siempre. Entonces, mi primer ejemplo que no es de clase de datos usa el mismo patrón para hacer eco de lo que hará el código generado por la clase de datos.__post_init__método.Visión general
La pregunta ha sido abordada. Sin embargo, esta respuesta agrega algunos ejemplos prácticos para ayudar en la comprensión básica de las clases de datos.
namedtupley otros .Esto es lo que significa la última frase:
namedtupleo una clase regular.En comparación con las clases comunes, principalmente ahorras escribiendo código repetitivo.
Caracteristicas
Esta es una descripción general de las características de la clase de datos (TL; DR? Consulte la tabla de resumen en la siguiente sección).
Lo que obtienes
Estas son las características que obtiene por defecto de las clases de datos.
Atributos + Representación + Comparación
Estos valores predeterminados se proporcionan configurando automáticamente las siguientes palabras clave en
True:Lo que puedes encender
Las funciones adicionales están disponibles si las palabras clave apropiadas están establecidas en
True.Orden
Ahora se implementan los métodos de pedido (operadores de sobrecarga:)
< > <= >=, de manera similar afunctools.total_orderinglas pruebas de igualdad más fuertes.Hashable, Mutable
Aunque el objeto es potencialmente mutable (posiblemente no deseado), se implementa un hash.
Hashable, inmutable
Ahora se implementa un hash y no se permite cambiar el objeto o asignar atributos.
En general, el objeto es hashable si
unsafe_hash=Trueofrozen=True.Consulte también la tabla lógica de hashing original con más detalles.
Lo que no entiendes
Para obtener las siguientes características, se deben implementar métodos especiales manualmente:
Desempacando
Mejoramiento
El tamaño del objeto ahora se reduce:
En algunas circunstancias,
__slots__también mejora la velocidad de creación de instancias y acceso a atributos. Además, los espacios no permiten asignaciones predeterminadas; de lo contrario,ValueErrorse plantea a.Vea más sobre tragamonedas en esta publicación de blog .
Tabla de resumen
+ Estos métodos no se generan automáticamente y requieren implementación manual en una clase de datos.
*
__ne__no es necesario y, por lo tanto, no se implementa .Características adicionales
Post-inicialización
Herencia
Conversiones
Convierta una clase de datos en una tupla o un dict, recursivamente :
Limitaciones
Referencias
fuente
De la especificación PEP :
El
@dataclassgenerador añade métodos de la clase que desea lo contrario define a sí mismo como__repr__,__init__,__lt__, y__gt__.fuente
Considera esta clase simple
FooAquí está la
dir()comparación incorporada. En el lado izquierdo estáFoosin el decorador @dataclass, y a la derecha está con el decorador @dataclass.Aquí hay otra diferencia, después de usar el
inspectmódulo para la comparación.fuente