Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Problemas com a iterabilidade da classe

Olá tudo bem? Estou com problema quanto a usar as seguintes funcionalidades in e for in

Quando uso o in para saber se o filme doutor estranho está contido na minha playlist final de semana espero que seja me passado o valor True mas me deparo com o valor False

#Verificando se tem o filme doutor estranho na playlist
print(f"O filme {filme_doutor_estranho.nome} está na playlist {playlist_fim_de_semana.nome}: {filme_doutor_estranho in playlist_fim_de_semana}")

Já em relação ao for in quando tento percorrer e exibir os itens dá minha playlist eles são preenchidos por None

#Escrevendo os filmes e as series contidas na playlist Fim de Semana na tela
for midia in playlist_fim_de_semana:
    print(midia)

Código completo:

from random import randint

#Classe mãe destinada a todos as subclasses que envolvem um tipo de midia
class Midia:
    def __init__(self, nome, ano_de_lancamento):
        self._nome = nome.title()
        self._ano_de_lancamento = ano_de_lancamento
        self._likes = 0

    def dar_like(self, likes = 1):
        self._likes  += likes

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

    @property
    def ano_de_lancamento(self):
        return self._ano_de_lancamento

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

#Classe destinada aos filmes (Filha dá Classe Midia)
class Filme(Midia):
    def __init__(self, nome, ano_de_lancamento, duracao_em_minutos):
        super().__init__(nome, ano_de_lancamento)

        self._duracao_em_minutos = duracao_em_minutos

    def __str__(self):
        return f"{self._nome} - {self._ano_de_lancamento} - {self._duracao_em_minutos} - {self._likes}"

#Classe destinada as series (Filha dá Classe Midia)
class Serie(Midia):
    def __init__(self, nome, ano_de_lancamento, quantidade_de_temporadas):
        super().__init__(nome, ano_de_lancamento)

        self.quantidade_de_temporadas = quantidade_de_temporadas

    def __str__(self):
        return f"{self._nome} - {self._ano_de_lancamento} - {self.quantidade_de_temporadas} - {self._likes}"

#Classe destinada as Playlists
class Playlist:
    def __init__(self, nome, lista_de_midias):
        self._nome = nome
        self._lista_de_midias = lista_de_midias

    def __getitem__(self, item):
        self._lista_de_midias[item]

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

    @property
    def lista_de_midias(self):
        return self._lista_de_midias

    @property
    def tamanho_playlist(self):
        return len(self._lista_de_midias)

#Iniciando os filmes e as series
serie_wandinha = Serie("wandinha", 2022, 1)
serie_big_mouth = Serie("big moth", 2017, 6)

filme_doutor_estranho = Filme("doutor estranho", 2016, 115)
filme_avatar_o_caminho_da_agua = Filme("Avatar: O Caminho da Água", 2022, 192)
filme_maze_runner_correr_ou_morrer = Filme("Maze Runner: Correr ou Morrer", 2014, 113)

#Realizando o ato de dar like
serie_wandinha.dar_like(randint(0, 101))
serie_big_mouth.dar_like(randint(0, 101))

filme_doutor_estranho.dar_like(randint(0, 101))
filme_avatar_o_caminho_da_agua.dar_like(randint(0, 101))
filme_maze_runner_correr_ou_morrer.dar_like(randint(0, 101))

#Criando a lista de filmes, series e filmes_e_series
filmes = [filme_doutor_estranho, filme_avatar_o_caminho_da_agua, filme_maze_runner_correr_ou_morrer]
series = [serie_wandinha, serie_big_mouth]

filmes_e_series = filmes + series

#Criando a Playlist
playlist_fim_de_semana = Playlist("Fim de Semana", filmes_e_series)

#Verificando se tem o filme doutor estranho na playlist
print(f"O filme {filme_doutor_estranho.nome} está na playlist {playlist_fim_de_semana.nome}: {filme_doutor_estranho in playlist_fim_de_semana}")

#Escrevendo o tamanho dá Playlist
print(f"Tamanho dá playlist {playlist_fim_de_semana.nome}: {playlist_fim_de_semana.tamanho_playlist}\n")

#Escrevendo os filmes e as series contidas na playlist Fim de Semana na tela
for midia in playlist_fim_de_semana:
    print(midia)
2 respostas

Boa tarde Artur, tudo bem?

Então, para o código rodar basta adicionar o getter lista_de_midias, conforme código:

#Verificando se tem o filme doutor estranho na playlist
print(f"O filme {filme_doutor_estranho.nome} está na playlist {playlist_fim_de_semana.nome}: {filme_doutor_estranho in playlist_fim_de_semana.lista_de_midias}")

#Escrevendo os filmes e as series contidas na playlist Fim de Semana na tela
for midia in playlist_fim_de_semana.lista_de_midias:
    print(midia)
solução!

Neste caso, você tem duas opções:

  1. Implementar duas funções na sua classe Playlist, contains (para usar o operador in) e iter (para usar o comando for in).
class Playlist:
    def __init__(self, nome, lista_de_midias):
        self._nome = nome
        self._lista_de_midias = lista_de_midias

    def __getitem__(self, item):
        self._lista_de_midias[item]

    def __contains__(self, item):
        return item in self._lista_de_midias

    def __iter__(self):
        return iter(self._lista_de_midias)

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

    @property
    def lista_de_midias(self):
        return self._lista_de_midias

    @property
    def tamanho_playlist(self):
        return len(self._lista_de_midias)
  1. Fazer com que a classe Playlist herde da classe list (Nesta opção você consegue utilizar todos os operadores de uma lista na sua instância de Playlist).
class Playlist(list):
    def __init__(self, nome, lista_de_midias):
        super().__init__(lista_de_midias) # objeto iterável da classe

        self._nome = nome
        self._lista_de_midias = lista_de_midias

    def __getitem__(self, item):
        self._lista_de_midias[item]

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

    @property
    def lista_de_midias(self):
        return self._lista_de_midias

    @property
    def tamanho_playlist(self):
        return len(self._lista_de_midias)