Для такого часто задаваемого вопроса мне бы хотелось, чтобы большинство 'int'
В объекте нет проблем с переменными атрибутов, которые необходимо устранить.
Вот моя попытка. Во-первых, это не лучшая характеристика:
'int' object has no attribute 'variable'
Поскольку большинство примеров, которые я вижу, имеют вид:
'int' object has no attribute 'method'
И были вызваны вызовом метода в int
, который не реализован int
:
>>> x = 4
>>> x.length()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'length'
>>>
Класс int
имеет методы:
>>> dir(int)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__',
'__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__',
'__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__',
'__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__',
'__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__',
'__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__',
'__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__',
'__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__',
'__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__',
'__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator',
'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>>
и вы можете позвонить им:
>>> help(int.bit_length)
Help on method_descriptor:
bit_length(...)
int.bit_length() -> int
Number of bits necessary to represent self in binary.
>>> bin(37)
'0b100101'
>>> (37).bit_length()
6
>>>
Который показывает нам, как вызывать метод для int
, не путая точку с десятичной точкой:
>>> (128).bit_length()
8
>>>
Но в большинстве случаев дело не в том, что кто-то пытается вызвать метод для int
, а в том, что int
является ошибочным получателем сообщения, предназначенного для другого типа объекта. Например, это распространенная ошибка:
TypeError: 'int' object has no attribute '__getitem__'
Что возникает в Python2, когда вы пытаетесь подписать int
:
>>> x = 4
>>> x[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object has no attribute '__getitem__'
>>>
Python3 дает более полезное сообщение, TypeError: 'int' object is not subscriptable
.
Иногда это может произойти, если вы повторно используете одно и то же имя переменной для хранения различных типов данных - практика, которую следует избегать.
Если вы получите сообщение об ошибке типа "AttributeError: 'int' object has no attribute 'append'"
, подумайте, какой тип объекта отвечает на append()
. A list
делает, поэтому где-то в моем коде я называю append()
на int
, где я думал, что у меня есть list
.