3

我有这个类适用于分数(例如(1,2),(3,4)等):

class Fraction(object):

    def __init__(self, num=0, denom=1):
        ''' Creates a new Fraction with numberator num and denominator denom'''
        self.numerator = num
        if denom != 0:
            self.denominator = denom
        else: 
            raise ZeroDivisionError
    def __str__(self):
        '''Returns the string numerator/denominator '''
        return "{0}/{1}".format(self.numerator, self.denominator)
    def __repr__(self):
        """blah"""
        return Fraction(self.numerator, self.denominator)

而且我想要一个子类混合数,它可以接受整数和分数(例如2分数(1,2),3分数(3,4)等)。但是,我不确定如何执行此操作,对于如何执行此操作的任何帮助将不胜感激

class MixedNumber(Fraction):
4

2 回答 2

5

MixedNumber在考虑使用提供的类来实现类时,有两种方法会立即浮现在脑海中Fraction。正如@HunterMcMillen 建议的那样,一种方法是让类使用composition,即利用不同的对象分别表示整数和分数部分。这使您可以访问类中的每个对象的专用方法,如果您正在构建的组件具有各自封装的不同行为,这将非常方便。

class MixedNumber(object):
   def __init__(self, whole_number, fraction):
        self.whole_number = whole_number
        self.fraction = fraction

   def __str__(self):
        if self.fraction.numerator == 0:
            return str(self.whole_number)
        elif self.whole_number == 0:
            return str(self.fraction)
        else:
            return '{} {}'.format(self.whole_number,self.fraction)

   def __repr__(self):
        return 'MixedNumber({},{!r})'.format(self.whole_number,self.fraction)

另一种可能性是继承,如果你的Fraction类支持假分数,那么你可以使用一个子类来适当地处理混合数字格式的初始化和字符串渲染,如下所示:

class MixedNumber(Fraction):
    def __init__(self, whole_number, fraction):     
        num = whole_number * fraction.denominator + fraction.numerator
        super(MixedNumber,self).__init__(num,  fraction.denominator)

    def __str__(self):
        # assume positive fractions for demonstration only
        q, r = divmod(self.numerator,self.denominator)
        if r == 0:
            return str(q)
        elif q == 0:
            return super(MixedNumber,self).__str__() 
        else:
            return '{} {}/{}'.format(q,r,self.denominator)

    def __repr__(self):
        q, r = divmod(self.numerator, self.denominator)
        return 'MixedNumber({},Fraction({},{}))'.format(q,r,self.denominator)

您的Fraction.__repr__方法应该返回一个字符串,当传入该字符串时eval应该实例化与源对象相等的东西,即eval(frac) == frac. 有关和之间区别的更多详细信息,请参阅此堆栈溢出问题__str____eval__

于 2013-05-23T04:41:15.790 回答
0

我最近完成Mixed了从标准库类继承的类的编写Fraction。它可能是关于如何使用父类的现有功能的一个很好的指南。来源在这里。它接受库类接受的任何内容作为输入,Fraction以及混合数字的字符串表示形式Mixed('3 4/5')whole_number/numerator/denominator例如Mixed(3,4,5). 的所有功能Fraction都已保留。 __str__并且__repr__会分别产生3 4/5Mixed(3,4,5)。它使转换为floator 标准Fraction就像 or 一样float(m)容易Fraction(m)。干杯

于 2013-11-14T00:16:22.087 回答