2
respostas

[Dúvida] Private ou protected?

Apesar de o professor durante a aula ter substituído o private por protected, aqui rodou normal deixando private mesmo:

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

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

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

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

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


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


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


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

atlanta.dar_like()
atlanta.dar_like()

print(f'Nome: {vingadores.nome} - Likes: {vingadores.likes}')
print(f'Nome: {atlanta.nome} - Likes: {atlanta.likes}')

A saída foi:

"C:\Program Files\Python310\python.exe" C:\Users\usuario\PycharmProjects\playlist\modelo.py 
Nome: Vingadores - Guerra Infinita - Likes: 3
Nome: Atlanta - Likes: 2

Process finished with exit code 0

Alguma coisa errada por baixo que eu não consigo entender ou não teria problema deixar private mesmo?

2 respostas

Oi, Italo

Variáveis de instância “privadas” não existem em Python.

O underscore ( _ ) é uma convenção seguida pela maioria dos programas em Python para identificar uma variável "privada"

https://docs.python.org/pt-br/3/tutorial/classes.html#private-variables

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

Que é uma convenção eu tinha entendido, Luis. Ocorre que o professor tinha informado que __ é convenção para deixar os atributos "privados" dentro de uma classe e _ é uma convenção para deixar os atributos "protegidos" para acessar atributos "protegidos" da classe-mãe na classe-filha. Ocorre que percebi que não há diferença entre utilizar o __ ou o _ no caso da herança e gostaria de saber se realmente precisa adotar a convenção do _ na classe-mãe ao invés de usar nas superclasses o __ como poderia utilizar nas classes-filha. De toda forma, obrigado por sua interação.