HOWTO · Python
Corriger l'erreur Object Has No Attribute en Python
Ce tutoriel traite de l'erreur Object has no attribute en Python.
Sur cette page
Python déclenche AttributeError lorsqu’il ne trouve pas un attribut sur l’objet situé avant le point. Le nom demandé peut être mal orthographié, défini sur un autre type ou absent parce que l’objet a été initialisé différemment de ce qui était prévu. Par exemple, une liste et un tableau NumPy sont de types différents : un attribut disponible sur l’un ne l’est pas automatiquement sur l’autre.
Que signifie l’erreur Python « object has no attribute » ?
Dans items.size, Python demande à l’objet associé à items l’attribut nommé size. L’erreur indique quel objet est concerné et quel nom manque ; elle ne signifie pas que ce nom est indisponible partout en Python. Avant de modifier le code, vérifiez le type de l’objet sur lequel porte l’accès.
Trouver pourquoi l’attribut est manquant
Commencez à l’endroit où l’expression en échec est exécutée. Affichez ou examinez le type de la variable, puis vérifiez l’orthographe et les majuscules par rapport à la classe ou à l’API que vous vouliez utiliser. Il se peut aussi qu’une valeur ait été remplacée plus tôt par un autre objet, par exemple une liste à la place d’un tableau.
Pour examiner rapidement un objet, dir(value) répertorie de nombreux noms qui lui sont accessibles. C’est une aide au débogage, mais pas une preuve complète qu’un attribut est inaccessible : le comportement d’une métaclasse peut exposer des attributs que dir() n’affiche pas. Consultez le guide des métaclasses Python pour en savoir plus.
Un petit exemple de classes permet de repérer clairement l’objet concerné. User définit name, contrairement à la classe distincte Guest :
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")
Le premier accès réussit, car person est une instance de User qui possède un attribut name. Le dernier accès demande name à l’instance visitor de Guest ; le gestionnaire, limité à cet accès, intercepte l’AttributeError de cette recherche et affiche une explication stable. Le message imprimé reste en anglais : « visitor has no name », c’est-à-dire que visitor n’a pas de nom. Les méthodes d’instance doivent avoir self comme premier paramètre afin que Python puisse leur transmettre l’instance lors de l’appel.
Corriger l’erreur d’attribut
Adaptez la correction à la cause : rectifiez une faute de frappe, utilisez l’attribut sur l’objet voulu, ou définissez et initialisez l’attribut ou la méthode dans la classe qui doit le fournir. Ne changez pas le type d’un objet uniquement pour rendre un nom disponible : d’autres parties du code peuvent dépendre de son type d’origine et échouer après cette modification.
Pour accéder normalement à un attribut, gardez la classe et les données de l’objet associées :
Exécutez cet exemple :
class Account:
def __init__(self, owner):
self.owner = owner
account = Account("Mina")
print(account.owner)
Mina
Gérer les attributs facultatifs en toute sécurité
Lorsqu’un attribut est réellement facultatif, hasattr(value, "name") vérifie si sa recherche aboutit. Utilisez cette vérification comme garde lorsque les deux cas nécessitent un comportement différent. Pour obtenir une valeur de remplacement, getattr(value, "name", default) renvoie la valeur par défaut si la recherche déclenche AttributeError. setattr() affecte un attribut ; cette fonction ne fournit pas de valeur de remplacement lors d’une recherche.
S’il est plus clair de traiter directement l’erreur, placez uniquement l’accès incertain dans un bloc try et interceptez AttributeError à cet endroit. Les autres erreurs restent ainsi visibles. Choisissez une valeur de remplacement en fonction de ce que le reste du programme peut gérer sans risque ; un espace réservé ne convient que s’il a le même sens qu’une valeur manquante dans votre cas.