Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Encapsulamento do tipo "Protegido"

Ao assistir a aula e tentar criar meu próprio exemplo eu senti dificuldade ao alterar o atributo de uma super classe. Foi então que resolvi pesquisar e achei que além dos mencionados:

Classe.nome 
Classe.__nome

Ainda existe o com apenas um "_"

Classe._nome

Foi assim que resolvi meu problema. Achei que seria importante falar desse terceiro tipo agora na aula de herança.

Segue o exemplo que eu criei:

class Pilha(object):
    'Classe que representa uma pilha'
    def __init__(self, tamanho, capacidade, amperagem):
        self.__tamanho = tamanho    #Private
        self.__capacidade = capacidade #Private
        self.__amperagem = amperagem #Private
        self._carregada = True  #Protected

    def esta_carregada(self):
        return self._carregada

    def descarregar(self):
        self._carregada = False

    def fornecer_energia(self):
        if(self.esta_carregada()):
            print('A pilha foi usada')
            self.descarregar()
        else:
            print('A pilha está descarregada')

class Pilha_Recarregavel(Pilha)
    'Classe que representa uma pilha recarregável a partir da classe Pilha':
    def __init__(self, tamanho, capacidade, amperagem, ciclos):
        super(Pilha_Recarregavel, self).__init__(tamanho, capacidade, amperagem)
        self.__ciclos = ciclos

    def obter_ciclos(self):
        return self.__ciclos

    def recarregar(self):
        if(super(Pilha_Recarregavel, self).esta_carregada()):
            print 'A pilha já está carregada'
        elif(self.obter_ciclos() == 0):
            print 'Essa pilha já atingiu o limite de ciclos, impossível carregar'
        else:
            print 'Pilha recarregada'
            self._carregada = True
            self.__ciclos -= 1;
p1 = Pilha("AA", 3000, 28)
print p1.esta_carregada()
p1.fornecer_energia()
p1.fornecer_energia()
print '\n\n'

p2 = Pilha_Recarregavel("AA", 3000, 28, 3)
print p2.esta_carregada()
p2.fornecer_energia()
p2.fornecer_energia()
p2.recarregar()
print p2.obter_ciclos()
print p2.esta_carregada()
p2.esta_carregada()
p2.recarregar()
p2.fornecer_energia()
p2.recarregar()
p2.fornecer_energia()
p2.recarregar()
p2.fornecer_energia()
p2.recarregar()
print p2.obter_ciclos()
1 resposta
solução!

Encapsulamento é a proteção dos atributos ou métodos de uma classe, em Python existem somente o public e o private e eles são definidos no próprio nome do atributo ou método.

Atributos ou métodos iniciados por no máximo dois sublinhados e terminados por um sublinhado são privados e todas as outras formas são públicas.

class A:
   a = 1 # atributo publico
   __b = 2 # atributo privado a class A

class B(A):
   __c = 3 # atributo privado a B

   def __init__(self):
     print self.a
     print self.__c

a = A()
print a.a # imprime 1

b = B()
print b.__b # Erro, pois __b é privado a classe A.
print b.__c # Erro, __c é um atributo privado, somente chamado pela classe.

print b._B__c # Imprime __c = 3, muito pouco utilizada, mas existe.

No curso Python 3 Orientação a objetos tem um capitulo somente sobre isso é e muito bom! https://cursos.alura.com.br/course/python-3-intro-orientacao-objetos/task/31319

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software