【问题标题】:Convert object to another class将对象转换为另一个类
【发布时间】:2017-09-25 16:53:10
【问题描述】:

我搜索过有关转换课程的类似问题,但没有一个对我有真正帮助。

我有一个 Fraction 类,如果可能,我想将它简化为一个 int。

class Fraction:
    def __init__(self, numerator, denominator):
        self.numerator = numerator
        self.denominator = denominator
        self.simplify()

        if self.denominator == 1:
            # convert self to int of value numerator

我在 Fraction 类中有一个函数,它可以在创建分数时简化分数(2/6 变为 1/3,等等)

    def simplify(self):
        div = gcd(self.numerator, self.denominator)
        self.numerator //= div
        self.denominator //= div

我目前对这个问题的解决方法如下:

def convert(fraction):
    if fraction.denominator == 1:
        return fraction.numerator  # int
    else:
        return fraction            # Fraction


f = Fraction(3, 1)
f = convert(f)

我在各种代数表达式中使用这些分数,所以我希望它们尽可能简单。例如。 1/2 + 1/2 = 1(而不是 1/1)

有什么方法可以将 Fraction 对象转换为 int 而不必每次都通过这个外部函数?

谢谢

【问题讨论】:

  • 即使这是可能的,我也不建议这样做。我可以看到动态更改对象的类型,使代码难以推理。 convert 返回两种不同类型的事实也并不理想。在使用返回值之前,您不需要进行手动类型检查吗?
  • 你知道python已经提供了Fraction类吗?可能对你有帮助:docs.python.org/3.6/library/fractions.html
  • 是的,还认为动态更改对象的类型不是正确的方法。
  • Carcigenicate,convert 函数只是我为了展示我想要完成的事情而拼凑起来的。我的课程可以处理整数和分数作为输入。 (用于嵌套分数等)
  • MiguelSR,内置的分数类对于我打算做的事情来说不够灵活。它最终将处理未知术语,例如。 2x^2。不过我事先并不知道这门课,所以谢谢你:)

标签: python python-3.x


【解决方案1】:

你可以做几件事:

  • 拥有返回两种不同类型的函数并不是最佳选择,因此您可以使用类方法处理转换。
  • 如果 print() 函数也支持转换,这将有所帮助

考虑到这一点,我只是将 convert 移到类中,并添加了一个 str 方法。

from fractions import gcd

class Fraction:
    def __init__(self, numerator, denominator):
        self.numerator = numerator
        self.denominator = denominator
        self.simplify()

    def __str__(self):
        if self.denominator == 1:
            return str(self.numerator)
        return '{}/{}'.format(self.numerator,self.denominator)

    def simplify(self):
        div = gcd(self.numerator, self.denominator)
        self.numerator //= div
        self.denominator //= div
    def convert(fraction):
        if fraction.denominator == 1:
            return fraction.numerator  # int
        return fraction # Fraction

if __name__ == '__main__':
    f = Fraction(6, 2)
    c = Fraction.convert(f)
    print(f)
    print(c)
    f2 = Fraction(3, 4)
    print(f2)

看看能不能帮到你。

【讨论】:

  • 我同意有一个返回 2 种类型的函数是不好的,这只是为了看看如果没有像这个附加函数这样的东西,是否可以让一个对象转换它的类。我可以同时处理整数和分数,所以也许将它更改为字符串表示会更简单。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2011-03-15
  • 2013-09-18
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 2021-10-30
  • 2017-10-15
  • 2011-04-10
相关资源
最近更新 更多