Jump to content

Classes Python


Astuto

Recommended Posts

Boas!

Estou a começar a programar e tou um bocado encalhado na questão das classes/objectos. Como é uma questão de por ideias em prática e explorar, eu comecei agora com classes e então decidi criar uma classe que calcula o volume de um aquariao  rectangular. Algo está errado no metodo que está a calcular o volume e não estou a chegar lá. Alguém pode dar uma dica?

 

class Sample:
    
    altura = None
    comprimento = None
    largura = None
    
    def __init__(self, altura, comprimento, largura):

        self.altura = altura
        self.comprimento = comprimento
        self.largura = largura

    def showInputs(self):

        print("A Altura e: " + self.altura)
        print("A comprimento e: " + self.comprimento)
        print("A Altura e: " + self.largura)

    def calcVolume(self):
        
        return (self.altura * self.comprimento * self.largura) / 1000
        
        
print("\n")
print("Introduzir as medidas do aquario")
print("\n")

altura = input("Introduzir a altura do aqua: ")
comprimento = input("Introduzir o comprimento do aqua: ")
largura = input("Introduzir a largura medidas do aqua: ")

aqua1 = Sample(altura, comprimento, largura)
print("\n")
aqua1.showInputs()
print ("\n")
print(aqua1.calcVolume())

Erro:

 

Traceback (most recent call last):
  File "C:/Users/dguimaraes/Documents/01 - DEV/02 - Python/classes.py", line 36, in <module>
    print(aqua1.calcVolume())
  File "C:/Users/dguimaraes/Documents/01 - DEV/02 - Python/classes.py", line 20, in calcVolume
    self.result = (self.altura * self.comprimento * self.largura) / 1000
TypeError: can't multiply sequence by non-int of type 'str

Link to comment
Share on other sites

Boas!

Estás a receber esse erro por estar a tentar multiplicar uma ou mais strings.

altura = input("Introduzir a altura do aqua: ")
comprimento = input("Introduzir o comprimento do aqua: ")
largura = input("Introduzir a largura medidas do aqua: ")

O método input retorna sempre strings portanto podes fazer 1 de 2 coisas:

  1. converter esses valores para inteiro a seguir ao input
  2. acrescentar ao método init a conversão dos valores para inteiros
  • Vote 1
Link to comment
Share on other sites

Como o pedro falou, tens que converter para um tipo numérico antes de multiplicar. Recomendo usar o tipo float, pois medidas podem não ser inteiras (1.5 etc).

Como estas estudando Orientação a objetos (OO), podes fazer a conversão no __init__ da classe, mas não é muito pythonico. Na realidade, em Python farias apenas uma função para calcular o volume. Em OO, um problema recorrente com números é a questão da unidade. Trabalhando com floats, você não tem como garantir que os valores estão corretos, somente se o usuário digitar todos com a mesma unidade. Seguem algumas correções e sugestões (ler os comentários, supondo Python 3):

# Não gostei do nome :-D
class Sample:
    # Não precisa inicializar e aqui é o espaço para
    # atributos da classe Sample.altura != self.altura!
    #altura = None
    #comprimento = None
    #largura = None

    def __init__(self, altura, comprimento, largura):
        # Não é muito Pythonico...
        self.altura = float(altura)
        self.comprimento = float(comprimento)
        self.largura = float(largura)
        # Apenas como exemplo
        self.verificavalores("Altura", self.altura)
        self.verificavalores("Comprimento", self.comprimento)
        self.verificavalores("Largura", self.largura)

    def verificavalores(self, nome, valor):
        if type(valor) is not float:
            raise ValueError("{} não é float".format(nome))

    def showInputs(self):
        print("A Altura é: {:6.2f}".format(self.altura))
        print("A comprimento é: {:6.2f}".format(self.comprimento))
        print("A Altura é: {:6.2f}".format(self.largura))

    def calcVolume(self):
        return (self.altura * self.comprimento * self.largura) #/ 1000 -> conversão de unidades?


print("\nIntroduzir as medidas do aquario\n")

altura = float(input("Introduzir a altura do aqua: "))
comprimento = float(input("Introduzir o comprimento do aqua: "))
largura = float(input("Introduzir a largura medidas do aqua: "))

aqua1 = Sample(altura, comprimento, largura)
print("\n")
aqua1.showInputs()
print ("\n")
print("Volume: {:6.2f}".format(aqua1.calcVolume()))

Eu acho legal também dar uma olhada em como validar os valores, como não aceitar valores negativos ou perguntar novamente valores errados.

Exemplo:

http://python.nilo.pro.br/listagem/capitulo 08/listagem-08-16.html

Eu não recomendo começar a estudar Python com objetos, mas primeiramente com funções. 

  • Vote 1
Link to comment
Share on other sites

Boas,

Antes demais obrigado pelas dicas, mas eu tou a seguir um livro, logo passou para a fase das classes, daí estar a entrar nas duvidas das classes, à partida as funções não acho que sseja complicado, apenas não estou habituado às formatações que usou. Mas é uma questão de gostos porque acho que há mais formas de formatar ou colocar os valores das variaveis nas prints.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.