Con PEP 557, las clases de datos se introducen en la biblioteca estándar de Python.
Utilizan el @dataclass
decorador 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
namedtuple
Los s son inmutables y no pueden tener valores predeterminados para los atributos, mientras que las clases de datos son mutables y pueden tenerlos.@dataclass
no hará que el sitio se desintegre.namedtuples
PUEDE 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
dataclasses
mó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
dataclasses
usted puede reducirlo a:El mismo decorador clase también puede generar métodos de comparación (
__lt__
,__gt__
, etc.) y la inmutabilidad mango.namedtuple
Las clases también son clases de datos, pero son inmutables por defecto (además de ser secuencias).dataclasses
son mucho más flexibles a este respecto, y pueden estructurarse fácilmente de modo que puedan desempeñar el mismo papel que unanamedtuple
clase .El PEP se inspiró en el
attrs
proyecto , que puede hacer aún más (incluidos slots, validadores, convertidores, metadatos, etc.).Si desea ver algunos ejemplos, recientemente utilicé
dataclasses
varias 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
dataclasses
módulo en las versiones de Python <3.7, puede instalar el módulo con respaldo (requiere 3.6) o usar elattrs
proyecto mencionado anteriormente.fuente
@dataclass
genera aproximadamente el mismo__init__
método, con unquantity_on_hand
argumento de palabra clave con valor predeterminado. Cuando crea una instancia, establecerá elquantity_on_hand
atributo 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.
namedtuple
y otros .Esto es lo que significa la última frase:
namedtuple
o 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_ordering
las 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=True
ofrozen=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,ValueError
se 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
@dataclass
generador 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
Foo
Aquí está la
dir()
comparación incorporada. En el lado izquierdo estáFoo
sin el decorador @dataclass, y a la derecha está con el decorador @dataclass.Aquí hay otra diferencia, después de usar el
inspect
módulo para la comparación.fuente