HOWTO · Python

Object Has No Attribute Fehler behoben in Python

In diesem Tutorial wird der Fehler `Objekt hat keinen Attributfehler` in Python behandelt.

Auf dieser Seite

Python löst AttributeError aus, wenn der Zugriff über den Punkt auf dem Objekt links davon fehlschlägt. Der angeforderte Name kann falsch geschrieben, für einen anderen Typ definiert oder nicht vorhanden sein, weil das Objekt anders als erwartet initialisiert wurde. Eine Liste und ein NumPy-Array sind zum Beispiel unterschiedliche Typen. Ein Attribut, das für den einen Typ verfügbar ist, steht deshalb nicht automatisch auch für den anderen bereit.

Was der Python-Fehler „object has no attribute“ bedeutet

Bei items.size fragt Python das an items gebundene Objekt nach einem Attribut namens size. Die Fehlermeldung nennt dieses Objekt und den fehlenden Namen. Sie bedeutet nicht, dass der Name in ganz Python nicht verfügbar ist. Prüfe den Typ des Objekts, auf das zugegriffen wird, bevor du den Code änderst.

Herausfinden, warum das Attribut fehlt

Beginne an der Stelle, an der der fehlerhafte Ausdruck ausgeführt wird. Gib den Typ der Variablen aus oder prüfe ihn anderweitig. Vergleiche dann Schreibweise und Groß- und Kleinschreibung mit der Klasse oder API, die du verwenden wolltest. Ein Wert kann zuvor auch durch ein anderes Objekt ersetzt worden sein, etwa durch eine Liste anstelle eines Arrays.

Zur schnellen Prüfung listet dir(value) viele Namen auf, die für ein Objekt verfügbar sind. Das hilft beim Debuggen, beweist aber nicht vollständig, dass auf ein Attribut nicht zugegriffen werden kann: Metaklassenverhalten kann Attribute bereitstellen, die dir() nicht anzeigt. Siehe den Leitfaden zu Python-Metaklassen für weitere Details.

Ein kleines Klassenbeispiel macht deutlich, auf welches Objekt zugegriffen wird. User definiert name, die unabhängige Klasse Guest dagegen nicht:

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")

Der erste Zugriff gelingt, weil person eine User-Instanz mit einem name-Attribut ist. Beim letzten Zugriff wird die Guest-Instanz visitor nach name gefragt. Der eng begrenzte Ausnahmehandler fängt den dabei auftretenden AttributeError ab und gibt eine feste Erklärung aus. Die unveränderte Ausgabe lautet „visitor has no name“ und bleibt auf Englisch; sie bedeutet, dass visitor keinen Namen hat. Instanzmethoden müssen self als ersten Parameter enthalten, damit Python ihnen beim Aufruf die jeweilige Instanz übergeben kann.

Den Attributfehler beheben

Richte die Korrektur nach der Ursache: Berichtige einen Tippfehler, greife auf das Attribut des vorgesehenen Objekts zu oder definiere und initialisiere das Attribut beziehungsweise die Methode in der Klasse, die es bereitstellen soll. Ändere den Typ eines Objekts nicht bloß, um einen Namen verfügbar zu machen. Anderer Code kann vom ursprünglichen Typ abhängen und nach der Änderung fehlschlagen.

Bei einem normalen, erfolgreichen Zugriff gehören die Klasse und die Daten des Objekts zusammen:

Führe dieses Beispiel aus:

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


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

Optionale Attribute sicher behandeln

Wenn ein Attribut tatsächlich optional ist, prüft hasattr(value, "name"), ob der Zugriff gelingt. Verwende die Prüfung als Schutzbedingung, wenn die beiden Fälle unterschiedlich behandelt werden müssen. Für einen Ersatzwert liefert getattr(value, "name", default) den Standardwert zurück, wenn der Zugriff AttributeError auslöst. setattr() weist einem Objekt ein Attribut zu; beim Zugriff liefert die Funktion keinen Ersatzwert.

Wenn die direkte Fehlerbehandlung verständlicher ist, setze nur den unsicheren Zugriff in einen try-Block und fange dort AttributeError ab. So bleiben andere Fehler sichtbar. Wähle den Ersatzwert danach aus, was der übrige Programmablauf sicher verarbeiten kann. Ein Platzhalter eignet sich nur, wenn er für deine Aufgabe dieselbe Bedeutung wie ein fehlender Wert hat.