class Conta:

   

    # __init__ chamada de funcao construtora

    def __init__(self,numero,titular, saldo, limite):

    #funcao construtora    

        print("construindo ojjecto {}".format(self))

        #self = faz referencia ao objecto dentro da memoria

        #  esses dois underline vc nao consegue acessar o valor diretamente, vai ter de fazer pelo metodo boas praticas __numero

        #chama-se encapasylamento

        self.__numero = numero

        self.__titular = titular

        self.__saldo = saldo

        self.__limite = limite


    #methods  = funções dentro de uma classe se chamam metodos

    def extrato(self):

        print(f" Saldo {self.__saldo} {self.__titular}")


    def deposita(self, valor):

        self.__saldo += valor


    def saca(self, valor):

        self.__saldo -= valor


    def transfere(self, valor, destino):

        #o self representa a conta nossa como uma origem

        self.saca(valor)

        destino.deposita(valor)

        print(f"Transfered {valor} from {self.__titular} to {destino.__titular} with sucess!")



>>> conta1.transfere(10.0,  conta)           

Transfered 10.0 from lucas to lucas with sucess!

>>> conta1 = Conta(123,"ronado",55.5, 1000.0) 

construindo ojjecto <conta.Conta object at 0x0000017D37359490>

>>> conta1.transfere(10.0,  conta)

Transfered 10.0 from ronado to lucas with sucess!

>>>