1
resposta

No Python, como definir um atributo como protegido, ou privado para que não possa ser acessado por outra classe ou método?

criando uma classe conta

Criando novos métodos para a classe conta


class Conta:

    def __init__(self, numero, titular, saldo, limite):
        print("Construindo objeto...{}".format(self))
        self.numero = numero
        self.titular = titular
        self.saldo = saldo
        self.limite = limite


    def deposita(self,valor):
        self.saldo += valor


    def saca(self,valor):
        self.saldo -= valor


    def extrato(self):
        print("Saldo {} do titular {}".format(self.saldo, self.titular))

importando a classe conta e criando o primeiro objeto e testando as novas funcionalidades


from conta import Conta

cliente1 = Conta(202034321,"Douglas",900.0,1000.0)
print(cliente1.titular)
print(cliente1.numero)
print(cliente1.saldo)
print(cliente1.limite)
cliente1.deposita(1000.0)
cliente1.extrato()
cliente1.saca(800.0)
cliente1.extrato()
cliente2 = Conta(373214042,"Tatyana",850.0,1000.0)
print(cliente2.titular)
print(cliente2.numero)
print(cliente2.saldo)
print(cliente2.limite)
cliente2.deposita(1000.0)
cliente2.extrato()
cliente2.saca(1850.0)
cliente2.extrato()

Resultado


[Running]
Construindo objeto...<conta.Conta object at 0x00000237A39E7DC0>
Douglas
202034321
900.0
1000.0
Saldo 1900.0 do titular Douglas
Saldo 1100.0 do titular Douglas
Construindo objeto...<conta.Conta object at 0x00000237A39E7D60>
Tatyana
373214042
850.0
1000.0
Saldo 1850.0 do titular Tatyana
Saldo 0.0 do titular Tatyana
1 resposta

Olá Douglas, tudo bem?

No Python temos por convenção o uso do underscore ( _ ) antes do nome de um atributo ou método para deixá-los como privado (encapsulado). Implementado no código apresentado ficará da seguinte forma.

class Conta:

    def __init__(self, numero, titular, saldo, limite):
        print("Construindo objeto...{}".format(self))
        self.__numero = numero
        self.__titular = titular
        self.__saldo = saldo
        self.__limite = limite


    def deposita(self,valor):
        self.__saldo += valor


    def saca(self,valor):
        self.__saldo -= valor


    def extrato(self):
        print("Saldo {} do titular {}".format(self.__saldo, self.__titular))

O encapsulamento tanto de métodos, quanto de atributos no Python, é um assunto que desperta diversas opiniões, isso por não ser algo obrigatório da linguagem - embora, seja extremamente importante definir a visibilidade de métodos e atributos quando se trabalha com orientação a objetos.

Também, é importante que não será possível invocar métodos que possuam duplo underscore fora da classe (através de objetos) e isso ocorre devido ao name mangling, que se trata de uma mudança no nome do método ou atributo para dificultar a leitura direta. Mas, reforço que apesar de dificultar, seu acesso não é impossível.

Para entender mais sobre atributos, métodos privados e até mesmo sobre name mangling, recomendo a leitura dos seguintes artigos - que estão em inglês, mas ao utilizar o recurso de tradução do próprio navegador, é possível compreender:

Em caso de dúvidas, encontro-me à disposição.

Abraços e bons estudos.

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