Причина в том, что до инициализатора, то есть __init__
функция, называется конструктор, то есть __new__
. Он вызывается с теми же аргументами, что и __init__
. Что касается вашего класса, он не определен, он называется суперкласс 'one, то есть float
' s, и возникает ошибка. Вы можете увидеть, если вы заключаете конструктор:
>>> class D(float):
... def __new__(cls, *args, **kwargs):
... print cls, args, kwargs
... return super(D, cls).__new__(cls, *args, **kwargs)
... def __init__(self, value):
... print value
...
>>> D('a')
<class '__main__.D'> ('a',) {}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in __new__
ValueError: could not convert string to float: a
Если вы хотите добавить пользовательские атрибуты, использовать что-то вроде следующим образом:
>>> class D(float):
... __slots__ = ['name']
... def __new__(cls, *args, **kwargs):
... name = kwargs.pop('name')
... obj = super(D, cls).__new__(cls, *args, **kwargs)
... obj.name = name
... return obj
...
>>> d = D(0, name='d')
>>> e = D(1, name='e')
>>> d, d.name
(0.0, 'd')
>>> e, e.name
(1.0, 'e')
Я прочитал другой [вопрос] (HTTP: // StackOverflow. com/questions/1936457/sub-classing-float-type-in-python-fail-to-catch-exception-in-init), и я не думаю, что это дубликат. Этот вопрос просто хочет перезаписать '__str__', и я пытаюсь установить атрибут имени в моем классе. Я пытаюсь с конструктором '__new__', но я не мог решить, как решить проблему, поэтому я думаю, что вопрос по-прежнему действителен! –