Ir ao conteúdo
  • Cadastre-se

Python Variáveis mudam de valor usando Classe em Python


Posts recomendados

Boa tarde, fiz esse código que opera números complexos usando Python, estou começando a usar POO e surgiu uma dúvida: até a parte da soma ele calcula e imprime tudo corretamente, mas quando chega na parte da multiplicação os valores de c1.real e c1.imag estão mudados. Ao invés de continuarem com os valores 2 e 3, eles passam a ser o resultado calculado na soma, 6 e 8, isso faz com que a multiplicação dê -16 + 62i ao invés de -7 + 22i. Colocar (c1.real, c1.imag) = (2, 3) antes de calcular a multiplicação foi a solução que encontrei, mas não entendo porque os valores dessas duas variáveis foram trocados pelos de soma. Como consertar isso sem ser pela gambiarra que fiz? Obrigada.

class Complexo:
    def __init__(self, a, b):
        self.real = a
        self.imag = b
        print(self)
        
    def soma(self, a, b, c, d):
        self.real = a+c
        self.imag = b+d
        return (self)

    def mult(self, a, b, c, d):
        self.real = ((a*c) - (b*d))
        self.imag = ((a*d) + (b*c))
        return (self)

    def __str__(self):
        s = "%2.f + %2.fi"%(self.real, self.imag)
        return s

print ("Complexo 1 = ", end="")
c1 = Complexo(2, 3)
print ("Complexo 2 = ", end="")
c2 = Complexo(4, 5)
print ("Soma =", c1.soma(c1.real, c1.imag, c2.real, c2.imag))
#(c1.real, c1.imag) = (2, 3)
print ("Multiplicação =", c1.mult(c1.real, c1.imag, c2.real, c2.imag))

 

Link para o comentário
Compartilhar em outros sites

Consegui "resolver" dessa maneira, mas dessa forma o método __str__ fica quase inútil, pois não imprime mais os resultados da soma e da multiplicação. Continuo sem entender a dúvida anterior.

 

class Complexo:
    def __init__(self, a, b):
        self.real = a
        self.imag = b
        print(self)
        
    def soma(self, a, b, c, d):
        print ("Soma = %2.f + %2.fi"%(a+c, b+d))

    def mult(self, a, b, c, d):
        print ("Multiplicação = %2.f + %2.fi"%(a*c - b*d, a*d + b*c))

    def __str__(self):
        s = "%2.f + %2.fi"%(self.real, self.imag)
        return s

print ("Complexo 1 = ", end="")
c1 = Complexo(2, 3)
print ("Complexo 2 = ", end="")
c2 = Complexo(4, 5)
c1.soma(c1.real, c1.imag, c2.real, c2.imag)
c1.mult(c1.real, c1.imag, c2.real, c2.imag)

 

Link para o comentário
Compartilhar em outros sites

Eles não estão sendo mudados magicamente, você que os está mudando ué '-'... você está alterando self.real e self.imag. Existem algumas soluções.

class Complexo:
    def __init__(self, a, b):
        (self.real, self.imag) = (a, b)
        
    def soma(self, c):
        return Complexo(self.real + c.real, self.imag + c.imag)

    def mult(self, c):
        return Complexo(self.real * c.real - self.imag * c.imag, self.real * c.imag + self.imag * c.real)

    def __str__(self):
        return "%2.f + %2.fi" % (self.real, self.imag)

A ideia aqui é que cada método que realiza uma operação recebe um outro número complexo, cria um terceiro número complexo com o resultado da operação e retorna esse número. As operações não alteram mais nenhum dos dois operandos. É um padrão muito usado, então tente entender o padrão aqui.

Não vou postar as linhas abaixo de teste atualizadas para o novo código, para que você mesmo tenha que entender para usar.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...