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__