8.8 Método Transfere
E a funcionalidade que transfere dinheiro entre duas contas? Podemos ficar tentados a criar um método que recebe dois parâmetros: conta1 e conta2 do tipo Conta . Cuidado: já sabemos que os métodos de nossa classe Conta sempre recebem a referência, o self - portanto o método recebe apenas um parâmetro do tipo Conta , a conta destino (além do valor):
class Conta:código omitido
def transfere(self, destino, valor): self.saldo -= valor destino.saldo += valorPara deixar o código mais robusto, poderíamos verificar se a conta possui a quantidade a ser transferida disponível. Para ficar ainda mais interessante, você pode chamar os métodosdeposita e saca já existentes para fazer essa tarefa:
class Conta:código omitido
def transfere(self, destino, valor): retirou = self.saca(valor)if (retirou == False): return Falseelse:
destino.deposita(valor) return True
Quando passamos uma Conta como argumento, o que será que acontece na memória? Será que o objeto é clonado?
No Python, a passagem de parâmetro funciona como uma simples atribuição como no uso do ”=“. Então, esse parâmetro vai copiar o valor da variável do tipo Conta que for passado como argumento para a variável destino . E qual é o valor de uma variável dessas? Seu valor é um endereço, uma referência, nunca um objeto. Por isso não há cópia de objetos aqui.
Esse último código poderia ser escrito com uma sintaxe muito sucinta. Como?
TRANSFERE PARA
Perceba que o nome deste método poderia ser transfere_para() ao invés de só transfere() . A chamada do método fica muito mais natural, é possível ler a frase em português que ela tem um sentido:
conta1.transfere_para(conta2, 50.0):
A leitura deste código seria “conta1 transfere para conta2 50 reais”.