我有这个类用于分数(例如(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):
答案 0 :(得分:5)
在考虑实现提供MixedNumber
类的Fraction
类时,有两种方法可以立即浮现在脑海中。正如@HunterMcMillen建议的那样,一种方法是让类使用 组合 ,这将分别利用不同的对象来表示整数和分数部分。这使您可以访问类中的每个对象专用方法,如果您构建的组件具有各自封装的不同行为,则可以很方便。
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__
之间区别的详细信息,请参阅this stack overflow question。
答案 1 :(得分:0)
我最近写完了继承自标准库Mixed
类的类Fraction
。它可能是如何使用父类的现有功能的良好指南。来源是HERE。它接受库Fraction
类接受的任何内容以及Mixed('3 4/5')
中的whole_number/numerator/denominator
或有限Mixed(3,4,5)
等混合数字的字符串表示。 Fraction
的所有功能都已保留。 __str__
和__repr__
分别会产生3 4/5
和Mixed(3,4,5)
。它可以转换为float
或标准Fraction
,就像float(m)
或Fraction(m)
一样简单。干杯