Поскольку так много вопросов о переполнении стека о 'int' object has no attribute 'variable' слишком специфичны только для конкретных сценариев такого сообщения об ошибке, я хотел бы знать аспекты кода, которые мне нужно было бы перепроверить в любой для данного сценария, включающего такое сообщение об ошибке.
Проще говоря, в этой сети нет ни одного вопроса, который требовал бы широкого обоснования указанного сообщения об ошибке, и я предполагаю, что довольно много читателей здесь предпочли бы исследовать эти типы вопросов, поскольку это настолько обычное явление, что здесь пользователи задают тот же вопрос, но с вопросами и ответами, слишком специфичными для этой конкретной области, чтобы быть полезными. В целом, многие из подобных вопросов на этом сайте просто слишком специфичны для конкретного контекста чьего-то кода.
Я хотел бы убедиться, что на этот вопрос дан ответ, который будет отвечать практически любой ситуации, связанной с указанным сообщением об ошибке. В связи с таким часто задаваемым вопросом я хотел бы, чтобы здесь было рассмотрено большинство проблем с 'int' object has no attribute variable.
Ваша проблема в том, что вы используете язык с динамической типизацией. На статически типизированном языке вы не могли запустить программу с этой ошибкой. Возможно, вам следует изучить подсказки типов для Python, чтобы смягчить эту проблему.






For such a commonly asked question, I would like most of the 'int' object has no attribute variable issues to be addressed here.
Вот моя попытка. Во-первых, это не лучшая характеристика:
'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(). list делает, поэтому где-то в моем коде я вызываю append() на int, где, как я думал, у меня есть list.
Ах, я, должно быть, не знал, что это 'int' object has no attribute 'method', а не 'int' object has no attribute 'variable'. Теперь я понимаю причины ошибки.
@RonZhang, технически это может быть переменная экземпляра, но примеры, которые я нашел в моем поиске, в основном оказались методами, поэтому я сосредоточился на этом.
Ошибка Объект 'foo' не имеет атрибута 'bar' означает, что в программе есть ошибка. Вот и ответ, который применим к любой такой ситуации.