1
resposta

Acho que ficou melhor assim!

O que mudou foi o seguinte, não coloquei o "def" na classe programa, com isso não precisei por ._nome e ._ano quando fiz os atributos imprime nas classes Filme e Serie.

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

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

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

# \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


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

    def imprime(self):
        print(f'Nome: {self.nome} - Ano: {self.ano} - Duração: {self.duracao} - Likes: {self.likes}')
# \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


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

    def imprime(self):
        print(f'Nome: {self.nome} - Ano: {self.ano} - Duração: {self.temporadas} - Likes: {self.likes}')

# \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

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

vingadores.darlike()
vingadores.darlike()
vingadores.darlike()
atlanta.darlike()
atlanta.darlike()

filmes_e_series = [vingadores, atlanta]

for programa in filmes_e_series:
    programa.imprime()

Resultado da execução ficou:

C:\Users\Administrador\AppData\Local\Programs\Python\Python38-32\python.exe C:/Users/Administrador/Documents/Programação/Python/OO2/modelo.py
Nome: Vingadores - Guerra Infinita - Ano: 2018 - Duração: 160 - Likes: 3
Nome: Atlanta - Ano: 2018 - Duração: 2 - Likes: 2

Process finished with exit code 0
1 resposta

Oi Ailton, tudo bem?

A ideia de deixar o método imprime na classe Programa que é a classe mãe de Filme e Série é para que as classes filhas sobrescrevam este método, aplicando assim o polimorfismo. E na ausência do método imprime na classe Série e Programa, o imprime de Programa seria chamado.

Talvez não tenha ficado tão clara a ideia do polimorfismo na aula. Tentarei te explicar um pouco mais sobre ele, tudo bem?

A ideia do polimorfismo é que uma classe genérica defina alguns métodos e as classes filhas sobrescrevam estes métodos, porque cada uma se comporta de uma maneira, porém, todos tem o mesmo comportamento geral em comum.

Podemos ilustrar melhor isto com uma classe genérica Animal onde a mesma possui o método de fala. E as classes filhas Cachorro e Gato herdam o método de fala da classe Animal, porém, concorda comigo que cada um "fala" de uma maneira? Então em código isto ficaria assim:

class Animal:

    def fala(self):
        print("Animal Falando")

class Cachorro(Animal):

    def fala(self):
        print("Auauau")

class Gato(Animal):

    def fala(self):
        print("Miau miau")

Observe que o método de fala foi sobrescrito nas classes filhas. Qual o benefício de utilizar desta forma? O objetivo é que você possa reutilizar o código(herança) modificando apenas alguns comportamentos da classe herdada(polimorfismo) mediante a necessidade.

E voltando ao seu problema, é ideal que deixe o método imprime na classe Programa para que o princípio polimórfico seja aplicado. E na classe Programa, o seu imprime poderia ficar desta forma:

    def imprime(self):
        print(f'Nome: {self.nome} - Ano: {self.ano}')

Ou seja, sem a necessidade de utilizar o underscore para chamar os atributos. Sem o underscore você está chamando a property em si que te retorna o valor daquele atributo.

Qualquer dúvida é só falar. Abraços e bons estudos!