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

Pra que serve o método __str__ na classe mãe?

Qual é o sentido de se implementar o método __str__ na classe mãe sendo que ela é a mais genérica e "sempre terá informações faltando"?

Não seria mais econômico e igualmente eficaz implementa-lo apenas nas classes filhas (mais específicas) visto que são elas que terão a informação completa que precisamos?

Tem algum truque Jedi escondido nessa implementação?

# -*- coding: UTF-8 -*-
# ../python3/oo2/Modelo.py

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

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

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

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

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

    def __str__(self):
        return f'{self._nome} de {self.ano} - {self._likes} likes'
# COM OU SEM ESSE MÉTODO OBTIVE O MESMO RESULTADO


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

    def __str__(self):
        return f'{self.nome} de {self.ano} - {self.duracao} temporadas - {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} de {self.ano} - {self.temporadas} temporadas - {self.likes} likes'


vingadores = Filme('vingadores - guerra infinita', 2018, 160)
vingadores.dar_like()
vingadores.dar_like()
vingadores.dar_like()

atlanta = Serie('atlanta', 2018, 2)
atlanta.dar_like()
atlanta.dar_like()

playlist = [vingadores, atlanta]

for programa in playlist:
    print(programa)
2 respostas

Olá Wilton, neste caso específico, não há necessidade dessa implementação. Mas lembre que seu modelo sempre pode crescer e ter filhas da classe Programa que não possuem temporadas, por exemplo - neste cenário, elas não precisariam sobrescrever o __str__().

Com o método__str__() na classe mãe, você cria um modo de exibição padrão da classe e apenas modifica quando necessário - assim as filhas aproveitam a implementação da mãe e não se repete código em cada uma delas.

Não sei se ficou claro. Aguardo seu feedback

solução!

Ok, vejamos se entendi:

O método __str__() na classe mãe garante que todas as implementações das classes filhas tenham a capacidade de imprimir nome, ano e likes.

Já nas classes filhas, este método só está ali porque elas tem algum parâmetro a mais a ser impresso. Por exemplo, se a classe Filmes não tivesse a "duração", o método __str__() não precisaria ser implementado nela pois, a classe Filmes herda da classe Programa a "capacidade" de imprimir nome, ano e likes.

É isso mesmo!?