PyWombat

← Volver a artículos

Data classes

June 26, 2020

1774 views

2 min de lectura

A partir de la versión 3.7 de Python podemos hacer uso del feature Data classes, una forma muy sencilla con la cual podemos crear clases que posean, principalmente datos.

Para nosotros hacer uso de los Data classes nos apoyaremos del decorador @dataclass.

from dataclasses import dataclass

@dataclass
class User:
    username: str
    email: str

En este caso basta con decorar nuestra clase, y definir todos los atributos (con sus correspondientes tipos) que poseerá.

Si nosotros instanciamos nuestra clase, debemos colocar como argumentos los valores para cada uno de sus atributos.

if __name__ == '__main__':

    user = User('Eduardo', 'eduardo78d@gmail.com')
    print(user.username)
    print(user.email)

Si en dado caso no asignamos un valor para un atributo, obtendremos como resultado un error.

TypeError: __init__() missing 1 required positional argument: '<Attr>'

Sin en el uso del decorado (@dataclass) la definición pudiera quedar de la siguiente manera.

class User:
    def __init__(self, username, email):
        self.username = username
        self.email = email

Una forma, desde mi punto de vista, mucho más convencional, y con la cual sin duda ya estamos más acostumbrados a lidiar.

Ahora ¿Qué pasa si nuestra clase debe poseer métodos? Bien, en esos casos es muy sencillo, basta con definirlos y listo.

@dataclass
class User:
    username: str
    email: str

    def saludar(self):
        print(f"Hola, soy el usuario {self.username}")

Lo interesante de tema de Data Classes es la cantidad minima de código que necesitamos para definir una clases, además que por default el método _\ repr_ ya se encuentra implementado, perfecto para realizar pequeños debugs si así lo deseamos.

>>> user = User('Eduardo', 'eduardo78d@gmail.com')
>>> print(user)

User(username='Eduardo', email='eduardo78d@gmail.com')

"Avanzado"

En caso no deseemos definir un tipo de dato en concreto para los atributos, podemos hacer uso de Any.

from typing import Any

@dataclass
class User:
    username: str
    email: str
    password: Any

Si por el contrario queremos indicar un valor por default a nuestro atributo, basta con hacer uso del operador igual (=).

from dataclasses import dataclass
from typing import Any

@dataclass
class User:
    username: str
    email: str
    password: Any = ''

    def saludar(self):
        print(f"Hola, soy el usuario {self.username}")

if __name__ == '__main__':

    user = User('Eduardo', 'eduardo78d@gmail.com')
    print(user)

Herencia

El tema de herencia no debería ser ningún problema, todo lo contrario.

@dataclass
class User:
    username: str
    email: str
    password: Any = ''

    def saludar(self):
        print(f"Hola, soy el usuario {self.username}")

class Administrador(User):
    pass

if __name__ == '__main__':

    admin = Administrador('Eduardo', 'eduardo78d@gmail.com')
    print(admin)