Печать списка, содержащего определенные пользователем объекты, возвращает адреса и реализацию корней комплексных чисел в python - PullRequest
0 голосов
/ 28 сентября 2019

Как часть попытки понять python, я пытаюсь реализовать комплексные числа как часть понимания классов.Я пытался реализовать магический метод pow , чтобы вернуть набор комплексных чисел для рациональных степеней и уникальное комплексное число для интегральной мощности.

Я пытался реализовать De Moivre'sФормула для интегральных степеней и ее обобщение для рациональных степеней.

def __init__(self,real=0,imag=0):
        self.real=real
        self.imag=imag
def arg(self):
        return atan2(self.imag,self.real)
def __abs__(self):
        return sqrt(self.real**2+self.imag**2)
def __str__(self):
        if self.imag == 0: 
            return f'{self.real}'
        if self.real == 0: 
            return f'{self.imag}i'
        sign = '+' if self.imag>0 else '-'
        return f'{self.real}{sign}{abs(self.imag)}i'
def __pow__(self, b):
        if isinstance(b,int): 
            if b==0:
                return 1          
            r=abs(self)**b
            t=self.arg()**b
            self.real=r*cos(t) 
            self.imag=r*sin(t)
            return self
        else:
            roots=list()
            c=Fraction(b).limit_denominator()
            c,d=c.numerator,c.denominator
            tem=self**c
            r=abs(tem)**(1/d)
            t=tem.arg()
            for i in range(d):
                tem.real=r*cos((t+2*pi*i)/d)
                tem.imag=r*sin((t+2*pi*i)/d)
                roots.append(tem)
            return roots

Я ожидал получить кубические корни единства для утверждений

a=complex(1,0)
print(a**(1/3))

но я получил адреса для объектов внутри списка.

[<__main__.complex object at 0x02FCEBF0>, <__main__.complex object at 0x02FCEBF0>, <__main__.complex object at 0x02FCEBF0>]

при добавлении str (Tem) я получил ответы, но неверный, как

['1.7099759466766968', '-0.8549879733383481+1.4808826096823642i', '-0.8549879733383492-1.4808826096823637i']

Что я хотел бы понять, так этокак я могу иметь записи в списке сложных типов (которые я выбрал в качестве своего класса), и все же распечатать их успешно и почему я получаю неправильный ответ.

1 Ответ

1 голос
/ 28 сентября 2019

Вам необходимо реализовать __repr__() в вашем классе complex.Хотя str() используется специально для преобразования в строку, repr() используется в большинстве других случаев, когда вы печатаете объект.Это может быть так же просто, как

def __repr__(self):
    return str(self)

, из-за которого repr будет выглядеть так же, как строка.В качестве альтернативы, вы можете сделать более явным указание в repr, что это комплексное число , чем просто его печать, и в этом случае вы можете сделать

def __repr__(self):
    return f"complex({str(self)})"

или что-то подобное,Вам решать, как вы хотите справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...