简体   繁体   中英

Python - How to return value from the class without changing the original value

I have a code that looks like. And my problem is that my code changes the original fraction.

class Fraction:
    """ This class represents one single fraction that consists of
        numerator and denominator """

    def __init__(self, numerator, denominator):
        """
        Constructor. Checks that the numerator and denominator are of
        correct type and initializes them.

        :param numerator: fraction's numerator
        :param denominator: fraction's denominator
        """

        if not isinstance(numerator, int) or not isinstance(denominator, int):
            raise TypeError
        elif denominator == 0:
            raise ValueError

        self.__numerator = numerator
        self.__denominator = denominator

    def return_string(self):
        """ Returns a string-presentation of the fraction in the format
        numerator/denominator """

        if self.__numerator * self.__denominator < 0:
            sign = "-"
        else:
            sign = ""
        return "{:s}{:d}/{:d}".format(sign, abs(self.__numerator),
                                     abs(self.__denominator))

    def complement(self):
        """ Complement the fraction """
        self.__numerator=-1*self.__numerator
        return self

    def reciprocal(self):
        """ Reciprocal the fraction """
        new_numerator=self.__denominator
        new_denominator=self.__numerator
        self.__numerator=new_numerator
        self.__denominator=new_denominator
        return self

So my codes gives

>>> frac = Fraction(-2, 4)
>>> frac.return_string()
'-2/4'
>>> complement = frac.complement()
>>> complement.return_string()
'2/4'
>>> reciprocal = frac.reciprocal()
>>> reciprocal.return_string()
'4/2'

But it should give me

>>> frac = Fraction(-2, 4)
>>> frac.return_string()
'-2/4'
>>> complement = frac.complement()
>>> complement.return_string()
'2/4'
>>> reciprocal = frac.reciprocal()
>>> reciprocal.return_string()
'-4/2'

So basically my problem is that when i return complement or reciprocal of the fraction it replaces the original fraction but i want the original fraction to remain the same.

In your complement and reciprocal methods, instead of mutating itself create a new instance of Fraction and return it.

def complement(self):
  """ Complement the fraction """
  return Fraction(-1*self.__numerator, self. __denominator)

def reciprocal(self):
    """ Reciprocal the fraction """
    new_numerator=self.__denominator
    new_denominator=self.__numerator
    return Fraction(new_numerator, new_denominator)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM