将float转换为Decimal保留str()表示

时间:2018-04-11 22:43:53

标签: python subclass

我正在尝试子类化decimal.Decimal,以便将浮点数视为字符串,而后者又被视为小数。

而不是:

>>> decimal.Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')

我将float转换为str,而str又转换为Decimal:

>>> decimal.Decimal(str(1.1))
Decimal('1.1')

因为我发现自己做了很多,所以我决定继承Decimal。但是下面的代码在Python 3.6.4中引发了一个异常:

import decimal

class D(decimal.Decimal):
    def __new__(self, value="0", context=None):
        value = str(value)
        super().__new__(value, context)

d = D(1.1)
print(d)

回溯:

Traceback (most recent call last):
  File "C:/Users/Better/.PyCharmCE2018.1/config/scratches/scratch_4.py", line 8, in <module>
    d = D(1.1)
  File "C:/Users/Better/.PyCharmCE2018.1/config/scratches/scratch_4.py", line 6, in __new__
    super().__new__(value, context)
TypeError: decimal.Decimal.__new__(X): X is not a type object (str)

解决方案是什么?

2 个答案:

答案 0 :(得分:3)

尝试:

super().__new__(self, value, context)

def __new__(self, value="0", context=None):需要三个位置参数,selfvaluecontext

super().__new__(value, context) self(来自您的函数)变为valuecontext变为value时,不需要定义最后两个值使用该功能,所以没有什么提醒你这个, context实际上从未传递给super().__new__()

答案 1 :(得分:3)

您将错误的参数传递给__new__并且您没有返回任何内容。

Documentation on how to use __new__

class D(decimal.Decimal):

    def __new__(cls, value="0", context=None):
        value = str(value)
        return super().__new__(cls, value, context)

话虽这么说,你应该在这里使用__init__,因为你没有做任何需要使用__new__的类型操作。

class D(decimal.Decimal):

    def __init__(self, value="0", context=None):
        value = str(value)
        super().__init__(self, value, context)