Общие причины, по которым объект «int» не имеет атрибута «переменная»?

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

Проще говоря, в этой сети нет ни одного вопроса, который требовал бы широкого обоснования указанного сообщения об ошибке, и я предполагаю, что довольно много читателей здесь предпочли бы исследовать эти типы вопросов, поскольку это настолько обычное явление, что здесь пользователи задают тот же вопрос, но с вопросами и ответами, слишком специфичными для этой конкретной области, чтобы быть полезными. В целом, многие из подобных вопросов на этом сайте просто слишком специфичны для конкретного контекста чьего-то кода.

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

Ошибка Объект 'foo' не имеет атрибута 'bar' означает, что в программе есть ошибка. Вот и ответ, который применим к любой такой ситуации.

user6655984 30.10.2018 03:55

Ваша проблема в том, что вы используете язык с динамической типизацией. На статически типизированном языке вы не могли запустить программу с этой ошибкой. Возможно, вам следует изучить подсказки типов для Python, чтобы смягчить эту проблему.

Felix 02.06.2021 00:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
1 806
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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'. Теперь я понимаю причины ошибки.

Ron Zhang 31.10.2018 01:21

@RonZhang, технически это может быть переменная экземпляра, но примеры, которые я нашел в моем поиске, в основном оказались методами, поэтому я сосредоточился на этом.

cdlane 31.10.2018 03:16

Другие вопросы по теме