float
является неизменным, поэтому его __init__
, инициализатор , в основном не работает - ничего существенного там не может произойти, потому что объект self
нельзя изменить (если он на самом деле это экземпляр float
, а не подкласса - но, конечно, __init__
должен * *1008* работать с этим предположением; -).
Следовательно, все действие происходит в __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)
и вы можете удалить __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
; -).