Распространенные причины "int" объекта не имеет атрибута "variable" "? - PullRequest
0 голосов
/ 30 октября 2018

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

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

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

1 Ответ

0 голосов
/ 30 октября 2018

Для такого часто задаваемого вопроса мне бы хотелось, чтобы большинство '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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...