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)