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

Como implementar um operador de adição em Python?

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

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

Um antropologista estava perguntando sobre aritmética a um homem de uma tribo primitiva. Quando o antropologista perguntou "Quanto é dois mais dois?", o homem da tribo respondeu: "Cinco". Ao ser questionado, o homem da tribo disse: "Se eu tenho uma corda com dois nós, e outra corda com dois nós, ao unir as cordas eu tenho cinco nós".

a. Faça uma classe Rope para representar uma corda com um dado número de nós. Implemente o operador de adição nessa classe de forma a unir as duas cordas como o homem da tribo descreveu. A classe deve ter um método __str__ para retornar o número de nós da corda.

b. Inclua uma função de teste para verificar a implementação do operador de adição.

Compartilhe

1 Resposta

0 votos
respondida Ago 30 por Fabio Fujita (36 pontos)  
editado Ago 30 por Fabio Fujita

Item a
Criamos a classe Rope inicialmente com três métodos: __init__, __str__ e __add__.

O método __init__ inicializa os atributos da classe criada, atribuindo o número de nós da corda à variável self.knots. O método __str__ retorna uma string informando o número de nós da corda consultada, enquanto o método __add__ implementa o operador de adição conforme a lógica do homem da tribo.

Ao receber o comando rope1+rope2, o Python executa o método __add__ da classe Rope e retorna a soma do número de nós de rope1 com o número de nós de rope2 mais 1 (referente ao nó de união das cordas).

O código da classe Rope é apresentado a seguir:

class Rope(object):

    def __init__(self, knots):
        self.knots = knots

    def __str__(self):
        return ('%s' % (self.knots))

    def __add__(self, other):
        soma=self.knots+other.knots+1
        return(soma)

Um teste rápido pode ser feito executando:

if __name__ == '__main__':
    rope1=Rope(2)
    rope2=Rope(3)
    rope3=rope1+rope2   
    print (rope3)

O comando cria rope1 com dois nós e rope2 com três nós. Após realizar a soma com a lógica do homem da tribo na variável rope3, exibe-se o resultado esperado: 6.

Item b
Para verificarmos o funcionamento do operador de adição que implementamos, criamos a função test_ropeadd(). A função cria duas cordas, ropetest1 e ropetest2, utilizando os métodos da classe e com um número conhecido de nós. Aplicamos o método __add__, obtendo o resultado em ropetest_sum.

Checamos se o resultado obtido após a execução da soma 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 a falha. Caso não ocorram erros, é exibida a mensagem "Sucesso - Operador de adição funcionando na classe Rope". A função test_ropeadd() é apresentada a seguir:

def test_ropeadd():
    print ("Teste em andamento")        
    rope1, rope2 = 2, 2
    resultado_esperado=rope1+rope2+1

    ropetest1=Rope(rope1)
    ropetest2=Rope(rope2)
    ropetest_sum=ropetest1+ropetest2

    assert ropetest_sum==resultado_esperado, 'Erro no operador de adição'

    print ('Sucesso - Operador de adição funcionando na classe Rope')

O código completo, incluindo o exemplo que executamos no item "a" e a chamada da função de teste é apresentado abaixo.

class Rope(object):

    def __init__(self, knots):
        self.knots = knots

    def __str__(self):
        return ('%s' % (self.knots))

    def __add__(self, other):
        soma=self.knots+other.knots+1
        return(soma)

    def test_ropeadd():
        print ("Teste em andamento")        
        rope1, rope2 = 2, 2
        resultado_esperado=rope1+rope2+1

        ropetest1=Rope(rope1)
        ropetest2=Rope(rope2)
        ropetest_sum=ropetest1+ropetest2

        assert ropetest_sum==resultado_esperado, 'Erro no operador de adição'

        print ('Sucesso - Operador de adição funcionando na classe Rope')


if __name__ == '__main__':
    rope1=Rope(2)
    rope2=Rope(3)
    rope3=rope1+rope2   
    print (rope3)

    Rope.test_ropeadd() 
...