
class Book:
'''Object for tracking physical books in a collection.'''
def __init__(self, name: str, weight: float, shelf_id:int = 0):
self.name = name
self.weight = weight # in grams, for calculating shipping
self.shelf_id = shelf_id
def __repr__(self):
return(f"Book(name={self.name!r},
weight={self.weight!r}, shelf_id={self.shelf_id!r})")
El mayor dolor de cabeza aquí es que debes copiar cada uno de los argumentos pasados a __init__ a las propiedades del objeto. Esto no es tan malo si sólo estás lidiando con Bookpero ¿qué pasa si tienes clases adicionales, por ejemplo, una Bookshelf, Library, Warehouse¿etcétera? Además, escribir todo ese código a mano aumenta las posibilidades de cometer un error.
Aquí está la misma clase implementada como una clase de datos de Python:
from dataclasses import dataclass
@dataclass
class Book:
'''Object for tracking physical books in a collection.'''
name: str
weight: float
shelf_id: int = 0
Cuando especificas propiedades, llamadas camposen una clase de datos, el @dataclass El decorador genera automáticamente todo el código necesario para inicializarlos. También conserva la información de tipo para cada propiedad, por lo que si también usa un linting que verifique la información de tipo, se asegurará de que esté proporcionando los tipos correctos de variables al constructor de la clase.




