1
resposta

[Dúvida] Tipagem dos atributos do metódo __init__

Olá a todos, quando eu insiro os métodos especiais no meu VScode, a informação é completada como no código abaixo:

class Musica:
  def __init__(self, nome, artista, duracao) -> None:
    self.nome=nome
    self.artista=artista
    self.duracao=duracao
    pass

  def __str__(self) -> str:
    return f'{self.nome},{self.artista},{self.duracao}'
  
musica = Musica('Under Pressure','Queen',300)

print(musica)

Estou na dúvida da tipagem. Neste exemplo, os atributos do metódo construtor estão setados para none no init, certo? Mas eu poderia setar cada atributo com um parametro diferente como no exemplo da aula? nesse caso, por convenção eu devo especificar os atributos como nome='' ou eu posso usar nome -> str. Funciona assim também para float e int? Por exemplo, duracao=0 ou duracao -> int e duracao=0.0 ou duracao -> float

estou pensando assim def __init__(self, nome -> str, artista-> str, duracao-> int)

1 resposta

Olá, Marcelo! Tudo bem?

No Python, você pode usar anotações de tipo para indicar o tipo esperado dos parâmetros, mas isso não define os valores padrões. Vamos esclarecer isso com exemplos práticos.

Agora, no seu código atual, você está inicializando os atributos no método __init__ sem especificar tipos:

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

    def __str__(self):
        return f'{self.nome}, {self.artista}, {self.duracao}'

musica = Musica('Under Pressure', 'Queen', 300)
print(musica)

Para adicionar anotações de tipo, você pode fazer da seguinte forma:

class Musica:
    def __init__(self, nome: str, artista: str, duracao: int):
        self.nome = nome
        self.artista = artista
        self.duracao = duracao

    def __str__(self):
        return f'{self.nome}, {self.artista}, {self.duracao}'

musica = Musica('Under Pressure', 'Queen', 300)
print(musica)

Note que as anotações de tipo (nome: str, artista: str, duracao: int) são apenas sugestões para o tipo dos parâmetros e não afetam a execução do código. Elas são úteis para ferramentas de análise estática e para melhorar a legibilidade do código.

Se você quiser definir valores padrão para os parâmetros, você pode fazer assim:

class Musica:
    def __init__(self, nome: str = '', artista: str = '', duracao: int = 0):
        self.nome = nome
        self.artista = artista
        self.duracao = duracao

    def __str__(self):
        return f'{self.nome}, {self.artista}, {self.duracao}'

musica = Musica()
print(musica)

Aqui, nome, artista e duracao têm valores padrão, o que permite criar uma instância da classe Musica sem passar argumentos.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.