Data classes



@eduardo_gpg

Número de visitas 1510

Tiempo de lectura 2 min

26 Junio 2020

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)

¿El contenido te resulto de ayuda?

Para poder dejar tu opinión es necesario ser un usuario autenticado. Login

Más Tips y Ejercicios 🐍

Adquiere una subscripción PyWombat por tan solo $3 USD. al mes.

Conoce los beneficios de ser usuario premium:
Niveles desbloqueados: Ten accesos a todos los niveles de ejercicios. 🔓
Nuevo límite: Incrementa tu límite de ejercicios por semana. 🚀
Contenido único: Recibe semanalmente recursos exclusivos de Python (Videos, Artículos y Capitulos del libro PyWombat, comienza como desarrollador Python. 🐍