Estructuras en Python
Python es un lenguaje de programación orientado a objetos, lo que significa que tiene clases y objetos. Mientras que C no es un lenguaje de programación orientado a objetos, lo que significa que solo se puede realizar programación funcional usándolo. Pero C tiene estructuras que son un tipo de datos definido por el usuario.
No tenemos estructuras en Python, pero podemos implementarlas o representar su comportamiento usando otros objetos, es decir, clases de datos. Una clase de datos es una clase que solo contiene campos y métodos CRUD (captadores y definidores) para manipular estos campos. El principal objetivo de estas clases es almacenar datos o representar algunos datos en forma de paquete. Las clases de datos representan entidades y, dado que las entidades tienen varios parámetros o propiedades, las clases de datos facilitan el empaquetado de todo en un solo objeto.
En este artículo, aprenderemos cómo usar clases de datos en Python.
Clase de datos en Python
Python 3.7 introdujo las clases de datos. Aunque las clases de datos se pueden implementar usando clases primitivas de Python, una clase de datos implementa la mayoría de las funcionalidades requeridas detrás de escena, lo que hace que el código Python para una clase de datos sea más corto y legible. La implementación usando clases primitivas de Python permitirá un mayor control, pero para clases de datos más grandes, la implementación puede volverse desordenada y masiva, haciéndola inmanejable.
Python tiene un decorador dataclass
, definido dentro del módulo dataclass
. Este decorador agrega automáticamente métodos especiales requeridos dentro de clases de datos como __init__()
, __repr__()
, etc.
Aquí hay un ejemplo.
from dataclasses import dataclass
@dataclass
class Item:
name: str
price: float
quantity: int
def total_cost(self) -> float:
return self.price * self.quantity
Como se mencionó anteriormente, el decorador @dataclass
agrega métodos especiales automáticamente. Esto significa que el siguiente método __init__()
se agregará automáticamente.
def __init__(self, name: str, price: float, quantity: int = 0):
self.name = name
self.price = price
self.quantity = quantity
Además, esta clase de datos se puede utilizar para crear objetos de tipo Item
, y estos objetos se pueden tratar como objetos de clase normales.
from dataclasses import dataclass
@dataclass
class Item:
name: str
price: float
quantity: int
def total_cost(self):
return self.price * self.quantity
a = Item("Chocolate", 25, 100)
b = Item("Chips", 35, 150)
c = Item("Cookie", 10, 50)
print(a)
print(b)
print(c)
print(a.total_cost())
print(b.total_cost())
print(c.total_cost())
El decorador dataclass
tiene algunos parámetros, a saber,
init
-True
por defecto. Si esTrue
, se definirá el método__init__()
de la clase de datos.repr
-True
por defecto. Si esTrue
, se definirá el método__repr__()
de la clase de datos.eq
-True
por defecto. Si esTrue
, se definirá el método__eq__()
de la clase de datos.order
-False
por defecto. Si esTrue
, se definirán los métodos__lt__()
,__le__()
,__gt__()
y__ge__()
de la clase de datos.unsafe_hash
-False
por defecto. Si esFalse
, se definirá el método__hash__()
de la clase de datos.frozen
-False
por defecto. Si esTrue
, los atributos de la clase de datos se congelarán. Esto significa que, una vez inicializados, no se pueden manipular más.match_args
-True
por defecto.kw_only
-False
por defecto. Si esTrue
, todos los campos de la clase de datos se marcarán como solo palabras clave.slots
-False
por defecto.
Estos parámetros se pueden configurar al colocar un decorador de dataclass
sobre una implementación de clase. Algunos ejemplos de los mismos son los siguientes.
@dataclass
class A:
pass
@dataclass(init=True, repr=True, order=True)
class B:
pass
@dataclass(
eq=True,
order=False,
unsafe_hash=True,
)
class C:
pass
Para obtener más información sobre el módulo
dataclass
consulte la documentación oficial aquí.