Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Projeto] Mão na massa: refatorando uma função

No Python, a criação de classes é uma parte essencial da programação orientada a objetos. Abaixo, temos um exemplo de uma classe chamada Musica que representa informações sobre uma música, como nome, artista e duração:

class Musica:
    nome = ''
    artista = ''
    duracao = int

Agora é sua vez! Refaça essa classe Musica utilizando uma forma mais concisa e expressiva, aproveitando a sintaxe simplificada do Python.

class Musica:
    musicas = []

    def __init__(self, nome, artista, duracao):
        self.nome = nome
        self.artista = artista
        self.duracao = duracao
        Musica.musicas.append(self)

    def listar_musicas():
        for musica in Musica.musicas:
            print(f'{musica.nome.ljust(20)} | {musica.artista.ljust(55)} | {musica.duracao} segundos')

musica_1 = Musica('  Bola e Fogo', 'MC Cabelinho e Teto', 189)
musica_2 = Musica('  Meu Mundo', 'MC PH feat: Baco Exu do Blues, WEY e Pedro Lotto', 198.6)
musica_3 = Musica('  2024', 'Vulgo FK, MC Ryan SP, Gustah e Pedro Lotto', 133.2)

texto = f'\n\n{'  Nome:'.ljust(20)} | {'Artista:'.ljust(55)} | Duração:'
print(texto)
print('=' * (len(texto) + 5))
Musica.listar_musicas()
print('\n\n')
1 resposta
solução!

Olá Marcos,

Bem interessante essa questão!

Eu pensei em algo assim:

from dataclasses import dataclass, field
from typing import ClassVar, List

@dataclass
class Musica:
    nome: str
    artista: str
    duracao: float
    musicas: ClassVar[List['Musica']] = []

    def __post_init__(self):
        self.musicas.append(self)

    @classmethod
    def listar_musicas(cls):
        for musica in cls.musicas:
            print(f'{musica.nome.ljust(20)} | {musica.artista.ljust(55)} | {musica.duracao} segundos')

...

O que foi feito:

@dataclass: Facilita a criação de classes que são usadas principalmente para guardar dados.

ClassVar: Mostra que musicas é uma variável da classe.

post_init: Método especial que roda depois do init, usado aqui para adicionar a instância à lista de músicas.

@classmethod: Método da classe que pode ser chamado na própria classe, não só em uma instância.

Espero que isso ajude!