Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Calculo do IMC com métodos específicos

Consultando as dúvidas já postadas no fórum consegui fazer o exercício, mas não na forma como queria. Ocorre que eu queria ter um método específico para cada ação, ou seja, uma para calcular e outra para imprimir

class Pessoa(object):
    'Classe para calcular o IMC de uma pessoa'
    def __init__(self,nome,peso,altura):
        self.nome = nome
        self.peso = peso
        self.altura = altura

    def calcula(self):
        imc = self.peso/(self.altura*self.altura)

    def imprime(self):
        print "O IMC do %s eh %f" % (self.nome,imc)

Depois, avançando mais um capítulo do curso, percebi que eu poderia manipular o IMC em um método específico, se eu o inserisse no método init, mas o resultado não foi o esperado.

class Pessoa(object):
    'Classe para calcular o IMC de uma pessoa'
    def __init__(self,nome,peso,altura):
        self.nome = nome
        self.peso = peso
        self.altura = altura
        self.imc = 0

    def calcula(self):
        self.imc = self.peso/(self.altura*self.altura)
        #print "O IMC do %s eh %f" % (self.nome,imc)    

    def imprime(self):
        print "O IMC do %s eh %f" % (self.nome,self.imc)

O resultado:

>>> from teste import Pessoa
>>> imc = Pessoa('Geovane',58,1.58)
>>> imc.imprime()
O IMC do Geovane eh 0.000000

Como alcançar o que eu quero?

2 respostas
solução!

Simples! A implementação do código está extremamente correta, porém, a execução está errada. Você esqueceu de chamar o método calcula.

Experimente fazer desta maneira:

>>> from teste import Pessoa
>>> imc = Pessoa('Geovane',58,1.58)
>>> imc.calcula()
>>> imc.imprime()

E dará o resultado.

Uma outra solução também é encapsular a chamada de calcula dentro de imprime. Altere os métodos para ficarem desta maneira:

class Pessoa(object):
    'Classe para calcular o IMC de uma pessoa'
    def __init__(self,nome,peso,altura):
        self.nome = nome
        self.peso = peso
        self.altura = altura
        self.imc = 0

    def calcula(self):
        self.imc = self.peso/(self.altura*self.altura)
        #print "O IMC do %s eh %f" % (self.nome,imc)
        return self.imc //INCLUSÃO DO RETORNO AQUI
    def imprime(self):
        print "O IMC do %s eh %f" % (self.nome, self.calcula()) //ALTERAÇÃO AQUI

Desta maneira, quando chamamos a função imprime() o objeto implicitamente está calculando o IMC através do retorno de self.calcula().

--- EDIÇÃO --- Fazendo desta maneira, não é necessário alterar a execução, pode rodar ele exatamente como você fez. Caso ainda tenha alguma dúvida, por favor, deixe-nos ciente nos comentários e boas aulas :).

Sensacional e muito óbvio! Mas nao liguei os pontos. Obrigado!