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})")
A maior dor de cabeça aqui é que você deve copiar cada um dos argumentos passados para __init__ às propriedades do objeto. Isso não é tão ruim se você estiver lidando apenas com Bookmas e se você tiver aulas adicionais – digamos, um Bookshelf, Library, Warehousee assim por diante? Além disso, digitar todo esse código manualmente aumenta suas chances de cometer um erro.
Aqui está a mesma classe implementada como uma classe de dados Python:
from dataclasses import dataclass
@dataclass
class Book:
'''Object for tracking physical books in a collection.'''
name: str
weight: float
shelf_id: int = 0
Quando você especifica propriedades, chamadas camposem uma classe de dados, o @dataclass decorador gera automaticamente todo o código necessário para inicializá-los. Ele também preserva as informações de tipo de cada propriedade, portanto, se você usar um linting que verifica as informações de tipo, isso garantirá que você esteja fornecendo os tipos corretos de variáveis para o construtor da classe.
