Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como adicionar um atributo de dado e uma função de teste a uma classe em Python?

0 votos
8 visitas
perguntada Ago 27 em Programação Computacional por Fabio Fujita (36 pontos)  
editado Ago 30 por Fabio Fujita

A classe AccountP implementa o conceito de uma conta bancária, para a qual definem-se os nomes, números de contas e o saldo para cada usuário. É possível realizar saques, depósitos e consultas de saldo.

Adicione um atributo de dado chamado transactions à classe AccountP, que é definida conforme a seguir:

class AccountP(object):
    def __init__(self, name, account_number, initial_amount):
        self._name = name
        self._no = account_number
        self._balance = initial_amount
    def deposit(self, amount):
        self._balance += amount
    def withdraw(self, amount):
        self._balance -= amount
    def get_balance(self):
        return self._balance
    def dump(self):
        s = '%s, %s, balance: %s' % \
            (self._name, self._no, self._balance)
        print (s)

O novo atributo deverá contar o número de transações realizadas pelos métodos deposit e withdraw. Exiba o número de transações no método dump. Escreva uma função de teste chamada test_Account para testar que a implementação da classe estendida está correta.

Exercício 7.2 do Cap. 7 do livro "A Primer on Scientific Programming with Python" de Hans Petter Langtangen, 5ª edição.

Compartilhe

1 Resposta

0 votos
respondida Ago 27 por Fabio Fujita (36 pontos)  

Para adicionar o atributo de contagem do número de operações de saque e depósito realizadas por cada usuário, partimos da classe AccountP fornecida.

Uma das formas de solucionar o problema é criar o atributo _transactions no método __init__, atribuindo o valor inicial zero. O método fica, portanto:

def __init__(self, name, account_number, initial_amount):
    self._name = name
    self._no = account_number
    self._balance = initial_amount
    self._transactions=0

A cada execução dos métodos __deposit__ e __withdraw__, incrementamos o contador com o comando self._transactions+=1. Os métodos ficam, portanto:

def deposit(self, amount):
    self._balance += amount
    self._transactions+=1

def withdraw(self, amount):
    self._balance -= amount
    self._transactions+=1

Para exibirmos o número de operações realizadas no método dump, simplesmente incluímos o atributo na string que será exibida:

def dump(self):
    s = '%s, %s, balance: %s, transactions: %s' % \
        (self._name, self._no, self._balance, self._transactions)
    print (s)

Para testarmos o funcionamento da classe AccountP, criamos a função test_Account(). A função cria um usuário de teste e realiza operações de saque, depósito e exibição de saldo. Sabemos os resultados esperados das operações e comparamos com resultado obtido pela execução dos métodos da classe, após verificarmos se a inicialização dos parâmetros está correta.

Verificamos se os resultados obtidos após a execução dos métodos está correto realizando uma comparação com o resultado esperado utilizando o comando assert. No caso de divergência, é exibida uma mensagem de erro indicando em qual método ocorreu a falha. Caso não ocorram erros, é exibida a mensagem "Sucesso - Classe AccountP funcionando". A função test_Account() é apresentada a seguir:

def test_Account():
    print ("Teste em andamento")
    nome, numero, inicial, deposito, saque = 'usertest','123', 100, 100, 150 
    contateste=AccountP(nome, numero, inicial)
    transaction_teste=0

    assert contateste._name==nome and contateste._no==numero \
        and contateste._balance==inicial and \
            contateste._transactions==transaction_teste, \
        'Erro na inicialização dos dados'

    contateste.deposit(deposito)
    transaction_teste+=1
    saldo_esperado=inicial+deposito
    assert saldo_esperado==contateste._balance, 'Erro na função deposit'

    contateste.withdraw(saque)
    transaction_teste+=1        
    saldo_esperado2=inicial+deposito-saque
    assert saldo_esperado2==contateste._balance, 'Erro na função withdraw'

    assert saldo_esperado2==contateste._balance, 'Erro na função getbalance'

    assert transaction_teste==contateste._transactions, 'Erro na função transactions'        

    print ('Sucesso - Classe AccountP funcionando')

Podemos simular o uso com o seguinte código:

if __name__ == '__main__':
    a1 = AccountP('Fabio', '00071', 100)
    a1.deposit(150)
    a1.withdraw(50)
    a1.withdraw(25)

    a2 = AccountP('Maria', '0037', 50)
    a2.withdraw(10)
    a2.deposit(20)

    a1.dump()
    a2.dump()

    print (a1.get_balance())

    AccountP.test_Account()

O código cria os usuários Fabio e Maria, realiza operações de saque e depósito, exibe as informações de nome, número da conta, saldo final e número de transações realizadas, faz uma consulta simples de saldo e, por fim, realiza um teste bem sucedido com a função test_AccountP().

A implementação completa da classe e a realização do teste é apresentada abaixo.

class AccountP(object):

    def __init__(self, name, account_number, initial_amount):
        self._name = name
        self._no = account_number
        self._balance = initial_amount
        self._transactions=0

    def deposit(self, amount):
        self._balance += amount
        self._transactions+=1

    def withdraw(self, amount):
        self._balance -= amount
        self._transactions+=1

    def get_balance(self):
        return self._balance

    def dump(self):
        s = '%s, %s, balance: %s, transactions: %s' % \
            (self._name, self._no, self._balance, self._transactions)
        print (s)

    def test_Account():
        print ("Teste em andamento")
        nome, numero, inicial, deposito, saque = 'usertest','123', 100, 100, 150 
        contateste=AccountP(nome, numero, inicial)
        transaction_teste=0

        assert contateste._name==nome and contateste._no==numero \
            and contateste._balance==inicial and \
                contateste._transactions==transaction_teste, \
            'Erro na inicialização dos dados'

        contateste.deposit(deposito)
        transaction_teste+=1
        saldo_esperado=inicial+deposito
        assert saldo_esperado==contateste._balance, 'Erro na função deposit'

        contateste.withdraw(saque)
        transaction_teste+=1        
        saldo_esperado2=inicial+deposito-saque
        assert saldo_esperado2==contateste._balance, 'Erro na função withdraw'

        assert saldo_esperado2==contateste._balance, 'Erro na função getbalance'

        assert transaction_teste==contateste._transactions, 'Erro na função transactions'        

        print ('Sucesso - Classe AccountP funcionando')


if __name__ == '__main__':
    a1 = AccountP('Fabio', '00071', 100)
    a1.deposit(150)
    a1.withdraw(50)
    a1.withdraw(25)

    a2 = AccountP('Maria', '0037', 50)
    a2.withdraw(10)
    a2.deposit(20)

    a1.dump()
    a2.dump()

    print (a1.get_balance())

    AccountP.test_Account()
...