HOWTO · Python

Arreglar el error Object Has No Attribute en Python

En este tutorial se habla del error object has no attribute en Python.

En esta página

Python genera AttributeError cuando falla la búsqueda de un atributo en el objeto situado antes del punto. El nombre solicitado puede estar mal escrito, pertenecer a otro tipo o no existir porque el objeto se inicializó de una manera distinta a la esperada. Por ejemplo, una lista y un arreglo de NumPy son tipos distintos; por eso, un atributo disponible en uno no está necesariamente disponible en el otro.

Qué significa el error de Python «object has no attribute»

En items.size, Python busca un atributo llamado size en el objeto asignado a items. El error identifica ese objeto y el nombre que falta; no significa que ese nombre no esté disponible en ningún lugar de Python. Antes de cambiar el código, comprueba el tipo del objeto al que se aplica el acceso.

Averigua por qué falta el atributo

Empieza por el lugar donde se ejecuta la expresión que falla. Imprime o inspecciona el tipo de la variable y, después, comprueba la ortografía y las mayúsculas frente a la clase o API que querías usar. También puede ocurrir que el valor se haya reemplazado antes por otro objeto, como una lista en lugar de un arreglo.

Para una inspección rápida, dir(value) enumera muchos de los nombres disponibles en un objeto. Es una ayuda para depurar, pero no demuestra por completo que un atributo no se pueda consultar: el comportamiento de las metaclases puede exponer atributos que dir() no muestra. Consulta la guía de metaclases de Python para más detalles.

Un ejemplo sencillo con clases deja claro cuál es el objeto receptor. User define name, mientras que la clase independiente Guest no lo hace:

class User:
    def __init__(self, name):
        self.name = name


class Guest:
    pass


person = User("Ada")
visitor = Guest()
print(person.name)
print(type(visitor).__name__)
try:
    visitor.name
except AttributeError:
    print("visitor has no name")

El primer acceso funciona porque person es un User que tiene name. El último acceso busca name en la instancia visitor de Guest; el manejador, limitado a esa búsqueda, captura su AttributeError e imprime el mensaje «visitor has no name». Ese mensaje permanece en inglés y significa que el visitante no tiene nombre. Los métodos de instancia deben incluir self como primer parámetro para que Python pueda pasarles la instancia al llamarlos.

Corrige el error de atributo

Adapta la solución a la causa: corrige el error tipográfico, accede al atributo desde el objeto previsto o define e inicializa el atributo o método en la clase que debe proporcionarlo. No cambies el tipo de un objeto solo para disponer de un nombre; puede que otro código dependa del tipo original y falle después del cambio.

Para acceder a un atributo normalmente, mantén juntos la clase y los datos del objeto:

Ejecuta este ejemplo:

class Account:
    def __init__(self, owner):
        self.owner = owner


account = Account("Mina")
print(account.owner)
Mina

Gestiona de forma segura los atributos opcionales

Cuando un atributo sea realmente opcional, hasattr(value, "name") comprueba si la búsqueda tiene éxito. Úsalo como condición cuando cada caso requiera un comportamiento distinto. Para obtener un valor alternativo, getattr(value, "name", default) devuelve el valor predeterminado si la búsqueda genera AttributeError. setattr() asigna un atributo; no proporciona un valor alternativo durante la búsqueda.

Si resulta más claro gestionar el error directamente, coloca únicamente el acceso incierto dentro de un bloque try y captura allí AttributeError. Así, los errores no relacionados siguen siendo visibles. Elige el valor alternativo según lo que el resto del programa pueda manejar de forma segura; un marcador de posición solo es apropiado si representa lo mismo que un valor ausente para tu tarea.