psr_21-22
psr_21-22 copied to clipboard
Criação de Classes
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)
)
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...
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()
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.