Python中的子类float类型无法在__init __()中捕获异常

Python 2.5中,我需要使用带有修改的__str __()方法的浮点数.此外,我需要知道构造函数何时失败.

为什么我无法捕获从float引发的异常._ init __()?

查询我的派生浮点对象的数值的最佳方式是什么?在我的代码中,我使用float(self).

class My_Number(float):
    def __init__(self, float_string):
        try:
            super(My_Number, self).__init__(float_string)
        except (TypeError, ValueError):
            raise My_Error(float_string)

    def __str__(self):
        if int(float(self)) == float(self):
            return str(int(float(self)))
        else:
            return str(round(float(self), 2))


>>> n = My_Number('0.54353')
>>> print n
0.54

>>> n = My_Number('5.0')
>>> print n
5

>>> n = My_Number('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): foo
最佳答案
float是不可变的,因此它的__init__是初始化器,基本上是一个无操作 – 没有什么实质可以发生在那里,因为自身对象不能被改变(如果它实际上是一个浮动的实例,而不是一个子类 – 但是当然float自己的__init__必须在这个假设下运行;-).

因此,所有的动作都发生在__new__,构造函数中,就像其他不可变类型一样,如int,str,tuple等等.相信__init__是一个构造函数是一个常见的错误:它不是,它需要一个已经构造的对象作为其第一个参数self,并且“初始化”它(如果可行,即如果该自我是可变的) – 施工本身发生在__new__.

所以,你的float子类应该开始:

class My_Number(float):
  def __new__(cls, float_string):
    try: return float.__new__(cls, float_string)
    except (TypeError, ValueError): raise My_Error(float_string)

你可以删除不需要的__init__.现在:

>>> n = My_Number('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in __new__
NameError: global name 'My_Error' is not defined

(当然,如果你有一个My_Error异常类定义,它会更好的工作;-).

转载注明原文:Python中的子类float类型无法在__init __()中捕获异常 - 代码日志