In Python versuche ich, eine Methode in einer Klasse auszuführen, und es wird eine Fehlermeldung angezeigt:
Traceback (most recent call last):
File "C:\Users\domenico\Desktop\py\main.py", line 8, in <module>
fibo.f()
TypeError: unbound method f() must be called with fibo instance
as first argument (got nothing instead)
Code: (swineflu.py)
class fibo:
a=0
b=0
def f(self,a=0):
print fibo.b+a
b=a;
return self(a+1)
Skript main.py
import swineflu
f = swineflu
fibo = f.fibo
fibo.f() #TypeError is thrown here
Was bedeutet dieser Fehler? Was verursacht diesen Fehler?
fibo = f.fibo()
Die Klasse muss mit Klammern instanziiert werden.fibo().f()
Antworten:
OK, zunächst müssen Sie keinen Verweis auf das Modul in einem anderen Namen erhalten. Sie haben bereits eine Referenz (aus dem
import
) und können diese einfach verwenden. Wenn Sie einen anderen Namen möchten, verwenden Sie einfachimport swineflu as f
.Zweitens erhalten Sie einen Verweis auf die Klasse, anstatt die Klasse zu instanziieren.
Das sollte also sein:
Eine gebundene Methode ist eine Methode , die an eine Instanz eines Objekts angehängt ist. Eine ungebundene Methode ist natürlich eine, die nicht an eine Instanz gebunden ist . Der Fehler bedeutet normalerweise, dass Sie die Methode für die Klasse und nicht für eine Instanz aufrufen. Genau dies geschah in diesem Fall, weil Sie die Klasse nicht instanziiert hatten.
quelle
swineflu.fibo().f()
wenn Sie es nur einmal anrufen.So reproduzieren Sie diesen Fehler mit möglichst wenigen Zeilen:
Dies schlägt aufgrund von TypeError fehl, da Sie die Klasse nicht zuerst instanziiert haben. Sie haben zwei Möglichkeiten: 1: Machen Sie die Methode entweder statisch, damit Sie sie statisch ausführen können, oder 2: Instanziieren Sie Ihre Klasse, damit Sie eine Instanz abrufen können auf, um die Methode auszuführen.
Es sieht so aus, als ob Sie die Methode statisch ausführen möchten. Gehen Sie folgendermaßen vor:
Oder Sie haben wahrscheinlich gemeint, die instanziierte Instanz wie folgt zu verwenden:
Wenn Sie dies verwirrt, stellen Sie folgende Fragen:
quelle
fibo = f.fibo
verweist auf die Klasse selbst. Sie wollten wahrscheinlichfibo = f.fibo()
(beachten Sie die Klammern) eine Instanz der Klasse erstellen, danachfibo.f()
sollte sie korrekt erfolgreich sein.f.fibo.f()
schlägt fehl, weil Sie im Wesentlichen anrufen,f(self, a=0)
ohne zu liefernself
;self
wird automatisch "gebunden", wenn Sie eine Instanz der Klasse haben.quelle
f
ist eine (Instanz-) Methode. Sie rufen es jedoch über auffibo.f
, wofibo
sich das Klassenobjekt befindet. Daherf
ist ungebunden (nicht an eine Klasseninstanz gebunden).Wenn du. .. getan hast
dann
f
ist das gebunden (an die Instanza
).quelle
Hier ist ein gutes Tutorial, um mit Klassen in Python zu beginnen.
quelle
In Python 2 (3 hat eine andere Syntax):
Was ist, wenn Sie Ihre Elternklasse nicht instanziieren können, bevor Sie eine ihrer Methoden aufrufen müssen?
Verwenden Sie
super(ChildClass, self).method()
diese Option, um auf übergeordnete Methoden zuzugreifen.quelle
Unterschiede in In Python 2 und 3 Version:
Wenn Sie bereits eine Standardmethode in einer Klasse mit demselben Namen haben und diese erneut als denselben Namen deklarieren, wird sie als Aufruf einer ungebundenen Methode dieser Klasseninstanz angezeigt, wenn Sie sie instanziieren möchten.
Wenn Sie Klassenmethoden wollten, diese aber stattdessen als Instanzmethoden deklarierten.
Eine Instanzmethode ist eine Methode, die zum Erstellen einer Instanz der Klasse verwendet wird.
Ein Beispiel wäre
Klassenbeschriftungsmethode:
In Python 2 und 3 unterscheiden sich die Klassen @classmethod, um in Python 3 zu schreiben, automatisch als Klassenbeschriftungsmethode und müssen @classmethod nicht schreiben. Ich denke, dies könnte Ihnen helfen.
quelle
Versuche dies. Für Python 2.7.12 müssen wir den Konstruktor definieren oder jeder Methode self hinzufügen, gefolgt von der Definition einer Instanz einer Klasse namens object.
quelle