1
resposta

[Dúvida] AttributeError: type object 'Programa' has no attribute 'temporadas'

Boa Noite,

Alguém poderia me ajudar? copiei o código do professor e aparece este erro(AttributeError: type object 'Programa' has no attribute 'temporadas')

class Programa:
    def __init__(self, nome, ano):
        self._nome = nome.title()
        self.ano = ano
        self._likes = 0

    @property
    def likes(self):
        return self._likes

    def dar_likes(self):
        self._likes += 1

    @property
    def nome(self):
        return self._nome

    @nome.setter
    def nome(self, nome):
        self._nome = nome

class Filme(Programa):
    def __init__(self, nome, ano, duracao):
        super().__init__(nome, ano)
        self.duracao = duracao

class Serie(Programa):
    def __init__(self, nome, ano, temporadas):
        super().__init__(nome, ano)
        self.temporadas = temporadas

vingadores = Filme('vingadores - guerra infinita', 2018, 160)
atlanta = Serie('atlanta', 2018, 2)
vingadores.dar_likes()
vingadores.dar_likes()
vingadores.dar_likes()

atlanta.dar_likes()
atlanta.dar_likes()

#print(f'Nome: {vingadores.nome} - Likes: {vingadores.likes}')
#print(f'Nome: {atlanta.nome} - Likes: {atlanta.likes}')


lista=[vingadores,atlanta]

for c in lista:
    if hasattr(Programa, 'duracao'):
        detalhes = programa.duracao
    else:
        detalhes = Programa.temporadas
    print(f'{c.nome}-{c.likes},{detail}')
1 resposta

Olá Hugo, tudo bem com você?

O erro, AttributeError: type object 'Programa' has no attribute 'temporadas', está sendo levantado devido à tentativa de acesso ao temporada da classe Programa no laço de repetição for.

A linguagem de programação Python é Case-Sensitive, ou seja, possui a capacidade de diferenciar entre letras maiúsculas e minúsculas. Assim, no momento em que é realizado a seguinte declaração: detalhes = Programa.temporadas no laço for, o Python realiza a tentativa de acesso ao método temporadas da classe Programa. Como não existe esse método na classe, é levantado o erro.

Será necessário realizarmos algumas mudanças no código, para isso seguiremos o mesmo padrão que foi utilizado na aula reduzindo ifs a partir do minuto 1:00.

Pontos que devem ser modificados:

  • No laço for, usaremos programa (em minúsculo) no lugar de Programa (com o P maiúsculo). Assim estaremos acessando um método do objeto programa e não da classe Programa.
  • Também no laço for substitua a declaração c por programa. Fazendo isso o código ficará com uma melhor compreensão.
  • Substitua detail por detalhes. A variável detail não foi declarada assim não será encontrada, gerando erro.

Abaixo o código já com as modificações apresentadas acima.

for programa in lista:
    if hasattr(programa, 'duracao'):
        detalhes = programa.duracao
    else:
        detalhes = programa.temporadas
    print(f'{programa.nome}-{programa.likes},{detalhes}')

Após realizarmos as mudanças acima, estaremos fazendo o uso dos objetos presentes na lista que foram salvos na variável programa durante a execução do laço for.

Salve o arquivo após as mudanças apresentadas e execute-o.

Para aprimorar ainda mais o seu aprendizado sobre o laço de repetição for, recomendo a leitura do seguinte artigo, onde será abordado com detalhes como é o seu funcionamento e como podemos trabalhar com essa estrutura da repetição.

Lembre-se que pode contar sempre com o fórum Alura, seja para tirar suas dúvidas, ou para compartilhar o seu desenvolvimento.

Fico à disposição.

Abraços e bons estudos.

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