Python子类
我有一门关于分数的课(例如,(1,2),(3,4)等): 我想有一个子类混合数,它可以接受整数和分数(例如2分数(1,2),3分数(3,4)等)。我不知道如何做到这一点,但是,任何关于如何做到这一点的帮助将不胜感激Python子类,python,class,Python,Class,我有一门关于分数的课(例如,(1,2),(3,4)等): 我想有一个子类混合数,它可以接受整数和分数(例如2分数(1,2),3分数(3,4)等)。我不知道如何做到这一点,但是,任何关于如何做到这一点的帮助将不胜感激 class MixedNumber(Fraction): 在考虑使用提供的分数类实现一个MixedNumber类时,有两种方法会立即浮现在脑海中。一种方法是@HunterMcMillen建议,让类使用组合,即使用不同的对象分别表示整数和分数部分。这使您能够访问类中的每个对象专用方法
class MixedNumber(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)
另一种可能性是继承,如果您的分数
类支持不正确的分数,则可以使用子类以混合数字格式适当处理初始化和字符串呈现,如下所示:
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.\uuuu repr\uuuu
方法应返回一个字符串,当传递到eval
时,该字符串应实例化与源对象相等的内容,即eval(frac)=frac
。有关\uuu str\uuu
和\uu eval\uu
之间区别的更多详细信息,请参见我最近完成了从标准库分数类继承的类混合
。对于如何使用父类的现有功能,它可能是一个很好的指南。消息来源是。它接受库Fraction
类接受的任何内容,以及混合数的字符串表示形式,如mixed('3 4/5')
或rational整数/分子/分母
中设置的mixed(3,4,5)
。Fraction
的所有功能都已保留<代码>\uuuu str\uuuu
和\uuuu repr\uuuu
将分别产生3 4/5
和混合(3,4,5)
。它使到浮点
或标准分数
的转换与浮点(m)
或分数(m)
一样简单。干杯我认为从分数
继承混合数字
没有意义。将分数
组合到MixedNumber
类中会更有意义。我同意@HunterMcMillen的观点,但请注意,您在文章末尾使用的语法完全适合在Python中继承。也许我不明白你在问什么或者你面临什么问题;你能澄清一下吗?子类总是表示“是”关系。因此,MixedNumber
似乎不适合从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)