Cómo usar Dataclasses en Python

Cómo usar Dataclasses en Python
Este artículo cubrirá una guía sobre el uso de los nuevos objetos "Dataclass" incluidos en Python 3.7 y versiones más nuevas. Las dataclass son como otras clases de Python, pero están especialmente diseñadas para ser utilizadas como contenedores de datos y proporcionan una sintaxis más limpia y más corta para crear rápidamente objetos de datos. Si conoce los objetos "namedTuple" y los ha usado en Python, puede definirlos como objetos de tipo de Nama Mutable. Puede crear nuevas instancias de datacLasses como cualquier otra clase o objetos de tipo NameTuple y acceder a sus atributos utilizando notación de puntos.

Sintaxis básica y uso

Para comprender una dataclass y su sintaxis, debe comprender primero el diseño y la estructura básicos de una clase de Python. A continuación se muestra un ejemplo que muestra una clase simple de Python:

Clase StockInhand:
def __init __ (yo, manzanas, naranjas, mangos):
ser.manzanas = manzanas
ser.naranjas = naranjas
ser.mangos = mangos
stock = stockInhand (40, 50, 60)
impresión (stock.manzanas, stock.naranjas, stock.mangos)

En la muestra de código anterior, se ha creado una nueva clase llamada "stockInhand" con un método "__init__" definido dentro de él. El método __init__ se invoca automáticamente cada vez que crea una nueva instancia de Clase StockInhand. En este caso, el método __init__ se ha definido con algunos argumentos obligatorios. Por lo tanto, no puede crear una nueva instancia de StockInhand sin algunos valores para los argumentos necesarios. El argumento "Self" proporciona una referencia a la instancia de una clase, por lo que puede usarlo para referirse a cualquier variable o método dentro de una clase siempre que estas variables y métodos se hayan definido haciendo uso del argumento Self. El autoengo actúa como una herramienta de conveniencia y se puede nombrar cualquier cosa. También puedes omitirlo por completo. En las últimas dos declaraciones, se crea una nueva instancia de Clase StockInhand y se accede a sus variables utilizando notación de puntos.

Después de ejecutar la muestra de código anterior, debe obtener la siguiente salida:

40 50 60

La misma clase se puede definir usando DatacLass de la siguiente manera:

de DataClasses import
@dataclass
Clase StockInhand:
manzanas: int
naranjas: int
Mangos: int
stock = stockInhand (40, 50, 60)
impresión (stock.manzanas, stock.naranjas, stock.mangos)

La primera declaración importa el decorador "DatacLass" del módulo "Dataclasses". Los decoradores se pueden usar para modificar el comportamiento de los objetos de Python sin cambiarlos realmente. En este caso, el decorador de datacLass está predefinido y proviene del módulo DatacLasses. Para definir un DatacLass, debe adjuntar DatacLass Decorator usando el símbolo "@" a una clase de Python, como se muestra en la muestra de código anterior. En las siguientes declaraciones, las variables en DatacLass se definen utilizando sugerencias de tipo para indicar qué tipo de objeto son. Se introdujeron sugerencias de tipo en Python 3.6 y se definen usando símbolos ":" (colon). Puede crear una nueva instancia de DataClass como cualquier otra clase de Python. Después de ejecutar la muestra de código anterior, debe obtener la siguiente salida:

40 50 60

Tenga en cuenta que si un método en DatacLass devuelve un valor, puede asignarle una pista de tipo usando el símbolo "->". Aquí hay un ejemplo:

de DataClasses import
@dataclass
Clase StockInhand:
manzanas: int
naranjas: int
Mangos: int
Def Total_stock (self) -> int:
volver a ser.manzanas + yo.naranjas + yo.mangos
stock = stockInhand (40, 50, 60)
impresión (stock.Total_stock ())

Se ha creado un nuevo método llamado "Total_stock" y se le ha asignado una pista de tipo "INT" reservada para indicar el tipo de valor de retorno. Después de ejecutar la muestra de código anterior, debe obtener la siguiente salida:

150

Las variables en los objetos de DataClass pueden tener valores predeterminados

Puede asignar valores predeterminados a los miembros de DataClasses después de un tipo de sugerencias. Aquí hay un ejemplo:

de DataClasses import
@dataclass
Clase StockInhand:
manzanas: int = 40
naranjas: int = 50
Mangos: int = 60
Def Total_stock (self) -> int:
volver a ser.manzanas + yo.naranjas + yo.mangos
stock = stockInhand ()
impresión (stock.Total_stock ())

En la segunda última declaración, no se han suministrado argumentos durante la creación de una nueva instancia de stockInhand DataClass, por lo que se han utilizado los valores predeterminados. Después de ejecutar la muestra de código anterior, debe obtener la siguiente salida:

150

Los miembros de DatacLass son mutables

Las dataclass son mutables, por lo que puede cambiar el valor de sus miembros obteniendo una referencia a ellos. A continuación se muestra una muestra de código:

de DataClasses import
@dataclass
Clase StockInhand:
manzanas: int = 40
naranjas: int = 50
Mangos: int = 60
Def Total_stock (self) -> int:
volver a ser.manzanas + yo.naranjas + yo.mangos
stock = stockInhand ()
existencias.manzanas = 100
impresión (stock.Total_stock ())

El valor de la variable de manzanas se ha cambiado antes de llamar al método total_stock. Después de ejecutar la muestra de código anterior, debe obtener la siguiente salida:

210

Creación de un DatacLass desde una lista

Puede crear un DatacLass mediante programación utilizando el método "Make_DataClass", como se muestra en la muestra de código a continuación:

importar dataclasses
campos = [("manzanas", int, 40), ("naranjas", int, 50), ("mangos", int, 60)]
Stockinhand = dataclasses.make_dataclass (
"StockInhand", Fields,
espacio de nombres = 'Total_stock': Lambda Self: Self.manzanas + yo.naranjas + yo.mangos
)
stock = stockInhand ()
existencias.manzanas = 100
impresión (stock.Total_stock ())

El método make_dataclass toma un nombre de clase y una lista de campos de miembros como dos argumentos obligatorios. Puede definir a los miembros como una lista de tuplas donde cada tupla contiene el nombre de la variable, su tipo de pista y su valor predeterminado. No es necesario definir el valor predeterminado, puede omitirlo para asignar ningún valor predeterminado. El argumento opcional del espacio de nombres toma un diccionario que se puede usar para definir funciones de miembros utilizando pares de valor clave y funciones lambda. El código anterior es exactamente equivalente a definir el siguiente DatacLass manualmente:

de DataClasses import
@dataclass
Clase StockInhand:
manzanas: int = 40
naranjas: int = 50
Mangos: int = 60
Def Total_stock (self):
volver a ser.manzanas + yo.naranjas + yo.mangos
stock = stockInhand ()
existencias.manzanas = 100
impresión (stock.Total_stock ())

Después de ejecutar las dos muestras de código anteriores, debe obtener la siguiente salida:

210

¿Por qué usar un dataclass en lugar de una clase??

Quizás se pregunte por qué utilizar Dataclasses si son casi lo mismo que otras clases de Python? Uno de los principales beneficios del uso de dataclasses es su concisión. Puede crear dataclasses utilizando taquigrafía limpia y mínima sin mucho código básico. Están especialmente diseñados para usarse como contenedores de datos donde se pueden acceder fácilmente a las variables utilizando la notación de puntos, aunque también puede usar dataclasses como clases completas. En términos simples, si desea usar una clase de Python solo para usarlo como un almacén de datos, Dataclass parece ser una mejor opción.

Conclusión

Las dataclass en Python proporcionan una forma mínima de crear rápidamente clases de Python destinadas a ser utilizadas como almacenes de datos. Puede obtener referencias a miembros de DatacLasses que usan notación DOT y son especialmente útiles cuando busca diccionarios como pares de valor clave a los que se puede acceder usando notación DOT.