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

Problemas na hora do print do tamanho da playlist

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_like(self):
        self._likes += 1

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

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

    def __str__(self):
        return f'{self._nome}, {self.ano}, {self._likes} Likes'


class Filme(Programa):

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

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

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

    def __str__(self):
        return f'{self._nome}, {self.ano}, {self.temporadas} temporadas, {self._likes} Likes'

class Playlist:
    def __init__(self, nome, programas):
        self.nome = nome
        self._programas = programas

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

    @property
    def listagem(self):
        return self._programas

    @property
    def __len__(self):
        return len(self._programas)

vingadores = Filme("vingadores - guerra infinita", 2018, 160)
atlanta = Serie("atlanta", 2018, 2)
tmep = Filme('todo mundo em pânico', 1999, 100)
demolidor = Serie('demolidor', 2016, 2)

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

filmes_e_series = [vingadores, atlanta, demolidor, tmep]

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

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

for programa in playlist_fim_de_semana:
    print(programa)

No comando do print do tamanho da playlist, o python me retorna o seguinte erro:

print(f'Tamanho do playlist: {len(playlist_fim_de_semana)}') TypeError: 'int' object is not callable

Como resolvo ?

2 respostas

Deixa, já resolvi.

Estava declarado como propriedade e por algum motivo não funcionava, então meu questionamento acaba sendo esse. Por que não funcionava como propriedade ?

solução!

Boa noite Caio, blz?

Seguinte tava olhando seu código e realmente o len() não se trata de uma property e não deve ser definido como tal. O len() é o que costuma-se chamar de método mágico em python e permite que seu objeto se comporte específica.

Segue trecho da aula aonde contém esta explicação:

Ou seja, não existe len() em Playlist. Isto porque há um dunder method que poderá ser implementado para que a lista se comporte como um sized, uma ideia de algo que possui tamanho, e que então precisará implementar um len() para que o len() externo possa funcionar em nossa classe.

No trecho abaixo, removeremos o @property, pois a partir de então ele é um método mágico:

@property
def listagem(self):
    return self._programas

E o deixaremos da seguinte maneira:

def __len__(self):
    return len(self._programas)

Deste modo, sempre que o len() externo for chamado, conseguiremos obter o len() da nossa listagem interna.


Resumindo vc não deve definir o método len() como se fosse @property pois irá quebrar o funcionamento desejado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software