Изменение экземпляра класса при его создании - PullRequest
0 голосов
/ 09 марта 2020

У меня есть этот код:

class Fraction:
    def __init__(self, top, bottom):
        self.num = top
        self.den = bottom
        self = self.to_lowest_form()

    def to_lowest_form(self):
        from math import gcd

        d = 0
        while d != 1:
            d = gcd(self.num, self.den)
            self.num //= d
            self.den //= d

        return Fraction(self.num, self.den)

    def __add__(self, other):
        pass

Как показывает приведенный выше код, мне нужно получить дробь , а затем положить ее в наименьшую форму после инициализации. (Я получаю RecursionError , и я знаю, почему).

Поэтому мой вопрос состоит в том, как я могу преобразовать недавно созданную дробь в ее наименьший срок (чтобы избежать вызов instance.lowest_form () в каждом методе)?

1 Ответ

1 голос
/ 09 марта 2020

Вы просто усложняете ситуацию, возвращая новый экземпляр Fraction при уменьшении числителя / знаменателя в методе to_lowest_form вместо того, чтобы возвращать сами уменьшенные числа. Вместо этого рассмотрите возможность сохранения уменьшенных чисел в качестве атрибутов, после внутреннего вычисления их уменьшенной формы.

Пример реализации:

from math import gcd

class Fraction:
    def __init__(self, top, bottom):
        self.num, self.den = self.reduce(num=top, den=bottom)

    @staticmethod
    def reduce(num, den):
        d = 0
        while d != 1:
            d = gcd(num, den)
            num //= d
            den //= d
        return num, den
...