float
是不可变的,因此它__init__
的 程序基本上是一个空操作- 在那里什么都不会发生,因为self
对象无法更改(如果它实际上float
是子类的实例,而不是子类的实例),但是当然必须float
自己__init__
根据该假设进行操作;-)。
因此,所有的行动发生在__new__
中, 适当的,就像其他不可变的类型,如int
,str
,tuple
,等。一个普遍的错误是认为它__init__
是一个构造函数:不是,它以一个已经构造的对象作为它的第一个参数self
,然后“初始化”它(如果可行,即,如果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)
>>> 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
定义了异常类,它会更好;-)。