2016-07-19 8 views
-1

Ich bin ziemlich neu in Python. Hier erstelle ich eine Klasse, die eine blobartige Struktur darstellt. Allerdings ergibt sich mein Code der folgende Fehler:Grundlegende Python-Klasse liefert TypeError

TypeError: add() takes 3 positional arguments but 4 were given

class Blob: 
    mass = 0 
    xvals = [] 
    yvals = [] 
    correlationVal = 0 

    def __init__(self): 
     Blob.mass = 0 
     Blob.correlationVal = 0 

    def add(x, y, newCorrel): 
     Blob.correlationVal = computeCorrelation(newCorrel) 
     Blob.mass += 1 
     Blob.xvals.append(x) 
     Blob.yvals.append(y) 

    def computeCorrelation(newCorrel): 
     prevCorrel = Blob.correlationVal*Blob.mass 
     updatedCorrel = (prevCorrel + newCorrel)/(Blob.mass + 1) 
     return updatedCorrel 

if __name__ == "__main__": 

    test1 = Blob() 
    print(test1.mass) 
    test1.add(0, 0, 12) 
    print(test1.mass) 
    print(test1.correlationVal) 
    test1.add(0, 1, 10) 
    print(test1.mass) 
    print(test1.correlationVal) 
    test1.add(1, 1, 11) 
    print(test1.mass) 
    print(test1.correlationVal) 
    print(test1.xvals) 
    print(test1.yvals) 

Was mache ich falsch hier tun, und wie kann ich geben 4 Eingänge, wenn ich 3 liefern?

Hinweis: Der Fehler ergibt sich aus der Zeile "test1.add (0, 0, 12)".

+6

Ihre Methoden sollten sich selbst als erster Parameter akzeptieren .. dh def add (self, x, y, newCorrel): – AK47

+0

Mögliches Duplikat von [Was ist der Zweck von self in Python?] (Http://stackoverflow.com/questions/2709821/was-ist-der-Zweck-von-selbst-in-Python) –

+0

Sie sollten einige Zeit damit verbringen, den [Klassen-Abschnitt im Tutorial] (https://docs.python.org/3/tutorial) zu lesen /classes.html#classes) - Sie müssen es möglicherweise mehrmals wiederholen: 9.1) Namen und Objekte und 9.2) Scopes und Namespaces Unterabschnitte sind ziemlich wichtig zu verstehen. Wenn ein Attribut ein Attribut * instance * sein soll, wird '' self''' normalerweise für den Namen der Instanz verwendet und ist immer das erste Argument, das an eine Instanzmethode übergeben wird. – wwii

Antwort

4

Ihre Instanzmethoden fehlen die self Referenz:

def computeCorrelation(self, newCorrel) 
#      ^

def add(self, x, y, newCorrel) 
#  ^

Die ersten von einer Instanz Methode übergebenen Parameter eine Referenz auf die Instanz der Klasse ist. Ihre add Methode sollte also 4 Argumente haben, aber Sie müssen nur 3 übergeben, wenn die Methode von einer Instanz der Klasse aufgerufen wird. Python übergibt den Verweis auf diese Instanz für Sie.


Mehr noch, Sie Ihre Attribute aus der Klasse verweisen selbst als Blob.some_attribute, sollten Sie stattdessen self verwenden:

def __init__(self): 
    self.mass = 0 
    self.correlationVal = 0 

Dies ändert diese Attribute nur auf dieser Instanz der Klasse das ist, was Sie beabsichtigen mit __init__. Das Gleiche sollte für die anderen Methoden gelten.

+0

Zusätzlich sollten sich die Methoden auf die Instanz 'self' und nicht auf die Klasse' Blob' beziehen. Die erste Zeile von '__init __ (self)' würde dann wie folgt aussehen: 'self.mass = 0' – Aaron

+1

@Aaron Ja, ich arbeitete daran –

+0

Ich sehe. Danke an alle für das Feedback! –

1

In einer Klasse ist das erste Argument einer Funktion self. Wenn Sie im Wesentlichen rufen Sie test1.add(0, 0, 12), Python Anruf test1.add(test1,0, 0, 12), so jetzt hat er 4 Argument.

class Blob: 
    mass = 0 
    xvals = [] 
    yvals = [] 
    correlationVal = 0 

def __init__(self): 
    self.mass = 0 
    self.correlationVal = 0 

def add(self,x, y, newCorrel): 
    self.correlationVal = computeCorrelation(self,newCorrel) 
    self.mass += 1 
    self.xvals.append(x) 
    self.yvals.append(y) 
+1

'self' ist nur eine Konvention btw, aber das ist eine gute! lass es uns behalten – pwnsauce

0

Das erste Argument auf ein Verfahren Python Klasse benötigt self d.h. def add(self, x, y, newCorrel): anstelle von def add(x, y, newCorrel): sein.

Self wird implizit an Klasseninstanzmethoden übergeben, wenn sie aufgerufen werden. Daher werden 4 Argumente übergeben, nicht nur die 3, die Sie explizit übergeben haben.

N.B. Nicht-Instanz-Methoden (statische Methoden) benötigen kein Selbst als ihren ersten Parameter. Weitere Details finden Sie unter here.