2
respostas

[Dúvida] Erro ao implementar uma busca de Filmes

Olá,

Após finalizar o código do Filmes.py, tentei implementar um método de busca de Filmes conforme o artigo abaixo de varias formas diferentes.

https://www.alura.com.br/artigos/como-comparar-objetos-no-python

Porém apareceu alguns erros como:

AttributeError: 'list' object has no attribute 'pesquisar'

ou

in __eq__
    return self._nome == busca.nome
AttributeError: 'str' object has no attribute 'nome'

segue os códigos abaixo,

Somente um detalhe,

eu separeu em dois programas. Filme.py que tem os atributos e os métodos e locadora.py onde crio os objetos que consomem Filme.py


import os
from abc import ABCMeta, abstractmethod # Importação da classe abstrata

os.system('clear')

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

    @property
    def likes(self):
        return self._likes
    
    def dar_like(self):
        self._likes += 1

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

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

    @abstractmethod
    def __str__(self):
        pass

    def __eq__(self, busca):
        return self._nome == busca.nome

class Filme(Catalogo):

    def __init__(self, nome, ano, duracao):
        # Herança da Classe mãe Catalogo para Filme
        super().__init__(nome, ano)
        self.duracao = duracao 

    def __str__(self):
        return f'Nome: {self._nome} - Ano {self.ano} - {self.duracao} min - Likes: {self._likes}'

    
class Serie(Catalogo):

    def __init__(self, nome, ano, temporadas):
        # Herança da Classe mãe Catalogo para Serie
        super().__init__(nome, ano)
        self.temporadas = temporadas

    def __str__(self):

        return f'Nome: {self._nome} - Ano {self.ano} - {self.temporadas} temporadas - Likes: {self._likes}'

class Playlist():

    def __init__(self, nome, catalogos):
        self.nome = nome
        self._catalogos = catalogos

    def __getitem__(self, item):
        return self._catalogos[item]

    def __add__(self, item):
        return self._catalogos + [item]
    
    def __append__(self, item):
        ad = [item]
        return self._catalogos.append(ad)
    
    def __len__(self):
        return len(self._catalogos)

    # OPÇAO DE PESQUISA #1
    @property
    def pesquisar(self, filme_procurado):
        for programa in self._catalogos:
            if filme_procurado == self._catalogos[programa].nome:
                return True
        return False

    # OPÇAO DE PESQUISA #2
    def __contains__(self, filme_procurado):
        for programa in self._catalogos:
            if filme_procurado == programa.nome:
                return True
        return False

from filme import Filme, Serie, Playlist

# List
vingadores = Filme('Vingadores', 2018, 180)
atlanta = Serie('Atlanta', 2018, 2)
tmep = Filme('Todo mundo em pânico',1999, 100)
demolidor = Serie('Demolidor', 2016, 2)
vf = Filme('Velozes e furiosos', 2010, 120)

# Likes
atlanta.dar_like()
atlanta.dar_like()
vingadores.dar_like()
tmep.dar_like()
tmep.dar_like()
demolidor.dar_like()
demolidor.dar_like()
demolidor.dar_like()

# List de Objetos
filmes_e_series = [vingadores, atlanta, demolidor, tmep]

playlist_fim_de_semana = Playlist("fim de semana", filmes_e_series)

# Impressão
print(f'Tamanho da playlist: {len(playlist_fim_de_semana)}')

for programa in playlist_fim_de_semana:
    print(programa)

print("================")

# Incluir item
#playlist_fim_de_semana.append(vf)
playlist_fim_de_semana += vf #ou
playlist_fim_de_semana.append(vf)

for programa in playlist_fim_de_semana:
    print(programa)

print(f'Tamanho da playlist: {len(playlist_fim_de_semana)}')

# OPÇAO DE PESQUISA DE CATALOGOS DE FILMES

filme_procurado = "Atlanta"

# OPÇAO DE PESQUISA #1
if filme_procurado in playlist_fim_de_semana:
    print(f'O filme {filme_procurado} está na playlist.')
else:
    print(f'O filme {filme_procurado} não está na playlist.')

# OPÇAO DE PESQUISA #2
if playlist_fim_de_semana.pesquisar(filme_procurado):
    print(f'O filme {filme_procurado} está na playlist.')
else:
    print(f'O filme {filme_procurado} não está na playlist.')
2 respostas

Olá,

'str' object has no attribute 'nome'

isso acontece porque vc está passando uma str para a variável filme_procurado, depois usando-a no if da primeira pesquisa. Esse if deveria receber um objeto Filme.

'list' object has no attribute 'pesquisar'

isso acontece porque quando vc utiliza o operador += com a variável playlist_fim_de_semana, ela recebe de volta um list. O que a torna um objeto do tipo list. O objeto do tipo list não possui o método pesquisar.

Apesar de vc ter implementado o método __append__ , ele não existe no Python.

Até +

Obrigado @Luciano.

Estou tentando encontar o nome de um objeto que esta contido numa List.

Vou revisar, vlw