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

Dúvida no Ex. 10 da Aula 8 - Orientação a objetos e o conceito de classe

Olá, estou recebendo um codigo de erro no programa calcula imc:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "imc.py", line 12, in imprimirImc
    imc = self.peso / (self.altura**2);
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
#-*- coding:UTF-8 -*-

class Pessoa(object):

    def __init__(self, nome, peso, altura):
        self.nome = nome
        self.peso = peso
        self.altura = altura


    def imprimirImc(self):
        imc = self.peso / (self.altura ** 2);
        print 'IMC de %s: %s' % (self.nome, imc);
6 respostas

Estranho, testei seu código aqui e funcionou normalmente. O que ta escrito no sua função main? Olha só a minha:

#-*- coding: utf-8 -*-

class Pessoa(object):

    def __init__(self, nome, peso, altura):
        self.nome = nome
        self.peso = peso
        self.altura = altura

    def imprimirImc(self):
        imc = self.peso / (self.altura ** 2);
        print 'IMC de %s: %s' % (self.nome, imc);

if __name__ == '__main__':

    pessoa = Pessoa(nome="Luiz", peso=65, altura=1.70)
    pessoa.imprimirImc()

Testando no terminal:

[loya@loya-desktop Área de trabalho]$ python2 imc.py 
IMC de Luiz: 22.491349481

Continuo a receber o mesmo erro:

>>> pessoa.imprimirImc()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "imc.py", line 12, in imprimirImc
    imc = self.peso / (self.altura** 2)
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
>>>

Aguardo o código que você instância objeto. Tá com cara que Vc passou peso como string. Por isso preciso do código.

Roberto, talvez você esteja se perdendo nos arquivos, pois seu código funciona perfeitamente. Será que você criou duplicado e está importando o errado?

Veja os passos que fiz para sue código funcionar:

1) Criei o arquivo pessoa.py com o código idêntico ao seu:

class Pessoa(object):

    def __init__(self, nome, peso, altura):
        self.nome = nome
        self.peso = peso
        self.altura = altura


    def imprimirImc(self):
        imc = self.peso / (self.altura ** 2);
        print 'IMC de %s: %s' % (self.nome, imc);

2) Depois, fui no terminal do python e importei seu arquivo:

from pessoa import Pessoa

3) Em seguida, ainda no terminal, criei um objeto:

 pessoa = Pessoa("Ronaldo", 105, 1.78)

4) Por fim, chamei o método para imprimir o IMC:

pessoa.imprimirImc()

E o resultado foi :

MC de Ronaldo: 33.1397550814

Novamente, se você está tento algum erro, é na hora de importar o arquivo e chamar o método. É esse passo que você não passou para nós, inclusive tenha certeza de importar corretamente o arquivo.

Então, novamente peço o código que você instancia a classe pessoa. Onde está?

Se você estiver fazendo (forma errada, que não vai funcionar, típico erro de lógica de programação):

 pessoa = Pessoa("Ronaldo", "105","1.78")

Terá o mesmo erro que você postou para nós! Então, como você infelizmente ainda não nos passou como você está chamando o método, temos que criar hipóteses e uma é que você está errando passando os números como script, como no exemplo acima.

Chamei o programa com

from imc import Pessoa
depois, pessoa = Pessoa('fulano', '1', '2.00'

pessoa.imprimirImc()

o resultado seria imc=0.25 mas recebo:

>>> pessoa.imprimirImc()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "imc.py", line 11, in imprimirImc
    imc = self.peso / (self.altura ** 2);
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'

-- coding: utf-8 --

class Pessoa(object):

def init(self, nome, peso, altura): self.nome = nome self.peso = peso self.altura = altura

def imprimirImc(self): imc = self.peso / (self.altura ** 2); print 'IMC de %s: %s' % (self.nome, imc);

Depois disso tudo fiz como o Luiz Herinque peguei o codigo que ele fez e excutei pelo terminal python imc.py e resultado 
0.25, mas quando chamo o interpretador do python e importo o código recebo a mensagem de erro citado acima.
vou purgar o python e reinstalar para resolver o problema se ele persistir no erro reinstalo o linux para uma versão mais estavel.

-- coding: utf-8 --

class Pessoa(object):

def init(self, nome, peso, altura): self.nome = nome self.peso = peso self.altura = altura

def imprimirImc(self): imc = self.peso / (self.altura ** 2); print 'IMC de %s: %s' % (self.nome, imc);

if name == 'main':

pessoa = Pessoa(nome="Luiz", peso=1, altura=2.00) pessoa.imprimirImc() ```

solução!

Roberto, o erro está na chamada. Vc está usando aspas simples para passar os valores (o que eu desconfiava).

Forma errada, que dá o erro que você reportou:

pessoa = Pessoa('fulano', '1', '2.00')

Remova as aspas simples e passe um número. Python não é igual JavaScript que faz conversões implícitas. Se vc usa aspas simples Python vai considerar como texto e não número. Impossível operações de divisão e multiplicação com texto em Python.

Forma correta:

pessoa = Pessoa('fulano', 1, 2.00)

Assim resolve. Não é necessário reinstalar Python. Só entender diferenças entre tipo e organização de arquivos.