我有这个类可以处理分数(例如 (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 Fraction(1,2)、3 Fraction (3,4) 等)。但是,我不确定如何执行此操作,如能提供有关如何执行此操作的任何帮助,我们将不胜感激
class MixedNumber(Fraction):
最佳答案
当考虑使用提供的Fraction
类实现MixedNumber
类时,会立即想到两种方法。正如@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) ==压裂
。参见 this stack overflow question有关 __str__
和 __eval__
之间区别的更多详细信息。
关于Python 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16705268/