Python 子类

标签 python class

我有这个类可以处理分数(例如 (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/

相关文章:

python - 错误 : Increase MaxLocksPerFile registry entry via Python

jquery - 快速 jQuery 选择器子元素

python - 如何以编程方式将在线网页目标元素打印为图像?

python - 如何使用 Ubuntu 在 Docker 中持久化 'ln'

python - Python中Enum和IntEnum之间的区别

c++ - 错误 LNK2019,原因不明

css - Div/class 不会水平对齐

class - scala - 创建对象而不使构造函数参数成为对象的成员

python - MapReduce:ValueError:要解压的值太多(预期为 2)

python - 我的 Mac 上的 Python 版本是什么?