HOWTO · Python

Python TypeError: 1 erforderliches Positionsargument fehlt

Dieses Tutorial behandelt den TypeError: missing 1 required positional argument: self in Python.

Auf dieser Seite

Der TypeError: missing 1 required positional argument: 'self' bedeutet meist, dass eine Instanzmethode ohne Instanz aufgerufen wurde. Bei einer Methode wie def fun(self) ist self der übliche erste Parameter. Python übergibt ihn, wenn die Methode über ein Objekt aufgerufen wird. self ist ein Parameter, kein Attribut. Erstellen Sie zuerst das Objekt und rufen Sie die Methode anschließend über dieses Objekt auf. Das Python-Schlüsselwort class kennzeichnet eine Klassendefinition.

Was „missing 1 required positional argument: ‘self’“ bedeutet

Eine Funktion, die ohne Decorator in einer Klasse definiert ist, ist eine Instanzmethode. Greifen Sie über eine Instanz darauf zu, bindet Python diese Instanz an die Methode und übergibt sie als self. Greifen Sie über die Klasse auf dieselbe Methode zu, steht Python keine Instanz zum Binden zur Verfügung; der erste erforderliche Parameter bleibt daher unbelegt.

Die Fehlermeldung benennt den fehlenden Parameter, nicht unbedingt einen fehlenden Wert für die eigentliche Aufgabe der Methode. Ist eine Methode etwa als def greet(self, name) definiert, kann self bei einem Aufruf ohne gebundene Instanz fehlen, selbst wenn Sie name angegeben haben. Dieser TypeError entsteht durch die Argumente des Aufrufs.

Wie der Aufruf einer Instanzmethode über die Klasse den Fehler verursacht

Mit Delft.fun() rufen Sie die Funktion über die Klasse auf. Erwartet fun den Parameter self, müssen Sie eine Instanz ausdrücklich übergeben oder – klarer – die Methode über eine Instanz aufrufen. Ein ähnlicher Fehler entsteht, wenn Sie die Klasse selbst einer Variablen zuweisen: m = Delft erstellt kein Objekt. Bei m.fun() wird weiterhin über die Klasse auf die Methode zugegriffen, sodass self ungebunden bleibt.

Benötigt der Konstruktor Daten, gehören diese in den Aufruf zum Erstellen der Instanz, zum Beispiel Delft("Stack"). Ohne die Klammern beim Konstruktor wird keine Instanz erstellt; dadurch wird kein Wert für self übergeben. Die Klasse lässt sich weiterhin als Klasse aufrufen, und der Zugriff auf die Methode über die Klasse ist nicht grundsätzlich unzulässig. Der Aufruf muss lediglich zu den Parametern der Methode passen.

Beheben Sie den Fehler durch Erstellen einer Instanz

Erstellen Sie mit allen erforderlichen Konstruktorargumenten eine Instanz, speichern Sie sie und rufen Sie die Methode über diese Instanz auf. Das folgende eigenständige Beispiel zeigt das übliche Vorgehen:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

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

    def fun(self):
        return self.name


m = Delft("Stack")
print(m.fun())

Dieses Beispiel wird erfolgreich ausgeführt und gibt Stack aus. Beim Aufruf wird m an self gebunden; die Methode gibt den beim Erstellen der Instanz gespeicherten Namen zurück.

Wann eine statische Methode sinnvoll ist

Eine statische Methode erhält nicht automatisch eine Instanz. Verwenden Sie @staticmethod, wenn eine Operation inhaltlich zur Klasse gehört, aber weder den Zustand einer Instanz liest noch ihn ändert. Eine Klasse könnte beispielsweise eine Formatierungshilfe anbieten, die nur ihr ausdrücklich übergebenes Argument verwendet. Rufen Sie diese Hilfsmethode je nach vorgesehener API über die Klasse oder eine Instanz auf.

Eine Instanzmethode in eine statische Methode umzuwandeln, ist keine allgemeine Lösung für diesen TypeError. Verwendet die Operation self.name oder andere Daten des jeweiligen Objekts, behalten Sie sie als Instanzmethode bei und erstellen Sie ein Objekt. Andernfalls können Sie den ungenutzten Parameter self entfernen und @staticmethod hinzufügen, um die beabsichtigte Aufrufweise deutlich zu machen.

Prüfen Sie die Methodendefinition und die Aufrufstelle

Lesen Sie die Methodensignatur und gleichen Sie jeden erforderlichen Parameter mit dem Aufruf ab. Lautet der erste Parameter self, prüfen Sie, ob die Methode über ein Objekt aufgerufen wird, das mit Klammern erstellt wurde – und nicht über die Klasse oder eine Variable, die lediglich auf die Klasse verweist. Achten Sie außerdem darauf, dass Konstruktorargumente beim Erstellen des Objekts und gewöhnliche Methodenargumente beim Methodenaufruf übergeben werden.

Zum Beispiel speichert m = Delft die Klasse. m = Delft("Stack") erstellt dagegen eine Instanz, wenn der Konstruktor einen Namen erwartet. Bei m.fun() übergibt Python die gebundene Instanz automatisch. Benötigt die Methode tatsächlich keine Instanzdaten, kommt @staticmethod infrage. Andernfalls behalten Sie die Instanzmethode bei und korrigieren Sie die Aufrufstelle.