1
resposta

[Dúvida] Meu código funcionou sem alterar os "__" dos atributos

Meu código funcionou normalmente mesmo sem tirar os duplos underlines da frente dos atributos. fiquei na dúvida da razão de isso ter acontecido, já que na videoaula deu erro ao fazer isso. Poderiam me explicar?

aqui está o meu código:

class Programa:

    def __init__(self, nome, ano):
        self.__nome = nome.title()
        self.ano = ano
        self.__likes = 0

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

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

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

    @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

class Serie(Programa):

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


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

vingadores.dar_like()

atlanta.dar_like()
atlanta.dar_like()


print(f"Nome: {vingadores.nome} - Ano: {vingadores.ano} - Duração: {vingadores.duracao} - Likes: {vingadores.likes}")
print(f"Nome: {atlanta.nome} - Ano: {atlanta.ano} - Temporadas: {atlanta.temporadas} - Likes: {atlanta.likes}")
1 resposta

Olá Hádria, tudo bem com você?

Peço desculpas pela demora em lhe responder.

O erro apresentado na aula, AttributeError: 'Filme' object has no attribute 'Programa_likes', está sendo levantado devido à tentativa de acesso de um atributo privado fora da classe a qual ele foi declarado, neste caso a classe mãe (Programa). Esse erro ocorre quando o método dar_like() é chamado no objeto da classe filha (Filme), esse método pertence à classe mãe e faz referência ao atributo privado desta classe.

Já no seu código, os objetos criados pelas classes filhas possuem o atributo __likes da classe mãe, devido à chamada do método super().__init__() nas classes filhas. Esse método é responsável por chamar o método inicializador da classe mãe, assim, os objetos criados pela classe filhas possuem os atributos definidos no método inicializador da classe mãe.

Dessa forma, no momento que ocorre a chamada do método dar_like() nos objetos das classes filhas não será elevado erro, pois os objetos possuem o atributo __likes.

A chamada do método super().__init__() será implementada aula: Reutilizando ainda mais.

Não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Espero ter lhe ajudado. Em caso de dúvidas estou à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!