1
resposta

Cap.2 , Aula 2 - Dúvida

class Programa:
    def __init__(self, nome, ano):
        self.__nome = nome.title()
        self.ano = ano
        self.__like = 0

class Filme(Programa):
    def _init_(self, nome, ano, temporadas):
        self._nome = nome.title()
        self.ano = ano
        self.duracao = duracao
        self._likes = 0  

Uma vez que estou herdando os atributos da classe Programa, porquê preciso ter nome e ano no construtor da classe Filmes? Entendi que o ponto da herança é evitar a repetição de código, não estaria os atributos nome e ano da classe Programa sendo repetidos na classe Filme? Obrigado desde já!

1 resposta

Boa tarde.

Na subclasse Filme, você precisa iniciar os construtores apenas dos atributos especializados dela. Não precisa iniciar os atributos que exitem na superclasse da qual herda; basta invocá-las por meio do argumento "super().init"

class Programa:
  def __init__(self, nome, ano):
    self._nome = nome # A utilização de 1 underscore ao invés de 2 underscores protege o atributo do mesmo jeito, porém permite que ele seja herdado por classes filhas
    self._ano = ano
    self._like = 0

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

  @property
  def ano(self):
    return self._ano

  @property
  def like(self):
    return self._like

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


class Filme(Programa): # A classe Filme herda os atributos e métodos da classe Programa
  def __init__(self, nome, ano, duracao):
    super().__init__(nome, ano) # Herda os construtores da classe Programa, que é a classe superior ou super()
    self._duracao = duracao # Monta o construtor apenas para os atributos que não foram herdados da classe mãe (superior) --> Conceito de generalização/especialização

  @property
  def duracao(self):
    return self._duracao

  def __str__(self):
    return f'Filme: {self.nome} | Ano: {self.ano} | Duração: {self.duracao} | Likes: {self.like}'