2013-12-19 2 views
2

Это то, что я делаю:Ошибка инициализации подкласс поплавка

class D(float): 
    def __init__(self, name): 
     self._name = name 
     print name 

Но когда я пытаюсь инициализировать на объект типа D:

d = D('aaa') 

Я получаю эту ошибку:

Traceback (most recent call last): 
    File "/home/user/untitled1.py", line 22, in <module> 
    d = D('aaa') 
ValueError: could not convert string to float: aaa 

Почему? Я не инициализирую float, просто установив имя. Я не называл __init__ поплавка.

+0

Я прочитал другой [вопрос] (HTTP: // StackOverflow. com/questions/1936457/sub-classing-float-type-in-python-fail-to-catch-exception-in-init), и я не думаю, что это дубликат. Этот вопрос просто хочет перезаписать '__str__', и я пытаюсь установить атрибут имени в моем классе. Я пытаюсь с конструктором '__new__', но я не мог решить, как решить проблему, поэтому я думаю, что вопрос по-прежнему действителен! –

ответ

2

Причина в том, что до инициализатора, то есть __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') 
+0

Итак, как я могу решить свою проблему? –

+0

@xndrme Извините, но я увидел только вопрос, а именно: «почему?». В чем проблема, которую вы пытаетесь решить? – alko

+0

@xndrme см. Обновление, отвечает ли оно вашим потребностям? – alko

Смежные вопросы