psr_21-22 icon indicating copy to clipboard operation
psr_21-22 copied to clipboard

Criação de Classes

Open Analtino2021 opened this issue 3 years ago • 3 comments

Boa Tarde, no Exercício 4 de criação de classes em Python estou a ter problemas em retornar o resultado executado por um Método da classe. por exemplo eu chamo o Método add mas o resultado obtido é apenas um dos valores inseridos para a soma. E creio que se deve a forma como implementei o método str(self) corte 2 )

Analtino2021 avatar Oct 25 '21 13:10 Analtino2021

Olá @Analtino2021 ,

é melhor copiar código para o github em vez das imagens, porque se for necessário fazer copy pasta as imagens não dão para fazer.

self é um nome reservado, pelo que não o pode utilizar. Experimente chamar result ao self e depois fazer o return do result. Assim deve functionar...

miguelriemoliveira avatar Oct 25 '21 13:10 miguelriemoliveira

Aqui está o código, professor @miguelriemoliveira já o tenho no repositório pessoal mas não sei como partilhar diretamente então copiei-o.

self é um nome reservado, pelo que não o pode utilizar. Experimente chamar result ao self e depois fazer o return do result. Assim deve functionar... --> foi a primeira coisa que fiz e deu exatamente o mesmo resultado

#!/usr/bin/env python3 from collections import namedtuple

class Complex:

def __init__(self, r, i):
    self.r = r  # store real part in class instance
    self.i = i  # store imaginary part in class instance

def multiply(self, y):
    # addapt code to use classes
    Firsts = self.r * y.r
    Outers = self.r + y.i
    Inners = self.i + y.r
    Lasts = self.i + y.i

    soma_real = Firsts + Lasts * (-1)
    soma_imaginaria = Outers + Inners

    result = Complex(r=soma_real, i=soma_imaginaria)
    return result

def add(self, y):
    # addapt code to use classes
    soma_real = self.r + y.r
    soma_imaginaria = self.i + y.i
    result = Complex(r=soma_real, i=soma_imaginaria)
    return result

def __str__(self):

    return '(%g + %g''i)' % (self.r, self.i)

addapt code to use classes

def main(): # declare two instances of class two complex numbers as tuples of size two c1 = Complex(5, 3) # use order when not naming c2 = Complex(i=7, r=-2) # if items are names order is not relevant

# Test add
print(c1)  # uses the __str__ method in the class
c1.add(c2)
print(c1)  # uses the __str__ method in the class

# test multiply
print(c2)  # uses the __str__ method in the class
c2.add(c1)
print(c2)  # uses the __str__ method in the class

if name == 'main': main()

Analtino2021 avatar Oct 25 '21 14:10 Analtino2021

Olá @Analtino2021 ,

primeiro umas dicas de como mostrar código.

Se é código python pode escrevê-lo de modo a indicar que é python (faça editar da minha resposta para ver como eu fiz). Fica assim:

#!/usr/bin/env python3
from collections import namedtuple

class Complex:

def __init__(self, r, i):
    self.r = r  # store real part in class instance
    self.i = i  # store imaginary part in class instance

def multiply(self, y):
    # addapt code to use classes
    Firsts = self.r * y.r
    Outers = self.r + y.i
    Inners = self.i + y.r
    Lasts = self.i + y.i

    soma_real = Firsts + Lasts * (-1)
    soma_imaginaria = Outers + Inners

    result = Complex(r=soma_real, i=soma_imaginaria)
    return result

def add(self, y):
    # addapt code to use classes
    soma_real = self.r + y.r
    soma_imaginaria = self.i + y.i
    result = Complex(r=soma_real, i=soma_imaginaria)
    return result

def __str__(self):

    return '(%g + %g''i)' % (self.r, self.i)

def main():
   # declare two instances of class two complex numbers as tuples of size two
   c1 = Complex(5, 3) # use order when not naming
   c2 = Complex(i=7, r=-2) # if items are names order is not relevant

   # Test add
   print(c1)  # uses the __str__ method in the class
   c1.add(c2)
   print(c1)  # uses the __str__ method in the class

   # test multiply
   print(c2)  # uses the __str__ method in the class
   c2.add(c1)
   print(c2)  # uses the __str__ method in the class

if name == 'main':
main()

Fica melhor não? A ideia é ajudar o mais possível a pessoa que vai gastar tempo a pensar no seu problema. Pense que lhe estão a pedir ajuda com estas duas apresentações: qual delas lhe daria mais vontade de responder?

Quanto à classe, repare que a classe representa um número complexo. Por isso tem as propriedades self.r e self.i, que são inicializadas no construtor da classe e podem ser consultadas em qualquer método da classe.

Quando se chama o método add, a ideia é adicionar ao número da classe um outro número complexo. Este é aliás a razão pela qual a função add só precisa de um número para somar (o outro é o da classe). Assim, o resultado da soma não deve ser retornado pela função add. Em vez disso, o resultado deve ser guardado no número da classe (self.r e self.i).

Repare que chamamos a classe da seguinte forma:

   # Test add
   print(c1)  # uses the __str__ method in the class
   c1.add(c2)
   print(c1)  # uses the __str__ method in the class

ou seja, adicionamos c2 ao c1, e o novo c1 já é o resultado da soma. O segundo print deveria ser diferente do primeiro.

miguelriemoliveira avatar Oct 25 '21 15:10 miguelriemoliveira