2010-11-03 2 views
2

Я знаю, что это плохая практика:У python int нет метода __iadd __()?

>>> a = 5 
>>> a.__radd__(5) 
10 
>>> a 
5 
>>> a.__iadd__(5) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'int' object has no attribute '__iadd__' 

Из любопытства, если ИНТ объект не имеет __iadd__, то как же += работу?

ответ

5

Из любопытства, если объект int не имеет __iadd__, то как работает + =?

a += 5 

Становится

a = a + 5 

Потому что нет __iadd__ для неизменяемых объектов.

Это (в сущности)

a = a.__add__(5) 

И работает хорошо. Новый объект int создается __add__.

Некоторые из правил приведены здесь http://docs.python.org/reference/datamodel.html#coercion-rules.

+3

Это, конечно, потому, что целые числа являются неизменяемыми, то есть нет никакого способа, чтобы целочисленный объект мог увеличивать себя. – delnan

+0

'a + = 5' не становится' a = a + 5'. Он может вызывать '__add__', но только если' __iadd__' не существует (как упоминает Пауло Сардино). –

+1

@ Томас Воутерс: Он не всегда может быть преобразован в это, но это касается случая, о котором спрашивал ОП, а именно «если объект' int' не имеет '__iadd__', то как работает' + = '? - как это было бы с другими неизменяемыми типами, которые имеют метод '__add__'. – martineau

3

Если объект не имеет __iadd__, то используется __add__. Метод __iadd__ считается оптимизированным в случае __add__, он не является обязательным.

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