it-swarm.com.de

Das Aufrufen einer Klassenmethode löst einen TypeError in Python aus

Ich verstehe nicht, wie Klassen verwendet werden. Der folgende Code gibt mir einen Fehler, wenn ich versuche, die Klasse zu verwenden.

class MyStuff:
    def average(a, b, c): # Get the average of three numbers
        result = a + b + c
        result = result / 3
        return result

# Now use the function `average` from the `MyStuff` class
print(MyStuff.average(9, 18, 27))

Error:

File "class.py", line 7, in <module>
    print(MyStuff.average(9, 18, 27))
TypeError: unbound method average() must be called with MyStuff instance as first argument (got int instance instead)

Was ist falsch?

71
stu

Sie können die Klasse instanziieren, indem Sie eine Variable deklarieren und die Klasse wie eine Funktion aufrufen:

x = mystuff()
print x.average(9,18,27)

Dies funktioniert jedoch nicht mit dem Code, den Sie uns gegeben haben. Wenn Sie eine Klassenmethode für ein bestimmtes Objekt (x) aufrufen, wird beim Aufrufen der Funktion immer ein Zeiger auf das Objekt als erster Parameter übergeben. Wenn Sie Ihren Code jetzt ausführen, wird die folgende Fehlermeldung angezeigt:

TypeError: average() takes exactly 3 arguments (4 given)

Um dies zu beheben, müssen Sie die Definition der Durchschnittsmethode so ändern, dass vier Parameter verwendet werden. Der erste Parameter ist eine Objektreferenz und die verbleibenden 3 Parameter beziehen sich auf die 3 Zahlen.

87
Ryan

Aus Ihrem Beispiel scheint es mir, dass Sie eine statische Methode verwenden möchten.

class mystuff:
  @staticmethod
  def average(a,b,c): #get the average of three numbers
    result=a+b+c
    result=result/3
    return result

print mystuff.average(9,18,27)

Bitte beachten Sie, dass eine starke Verwendung statischer Methoden in python) normalerweise ein Symptom für einen schlechten Geruch ist. Wenn Sie wirklich Funktionen benötigen, deklarieren Sie diese direkt auf Modulebene.

34
rob

Um Ihr Beispiel minimal zu ändern, können Sie den Code folgendermaßen ändern:

class myclass(object):
        def __init__(self): # this method creates the class object.
                pass

        def average(self,a,b,c): #get the average of three numbers
                result=a+b+c
                result=result/3
                return result


mystuff=myclass()  # by default the __init__ method is then called.      
print mystuff.average(a,b,c)

Oder um es vollständiger zu erweitern und andere Methoden hinzuzufügen.

class myclass(object):
        def __init__(self,a,b,c):
                self.a=a
                self.b=b
                self.c=c
        def average(self): #get the average of three numbers
                result=self.a+self.b+self.c
                result=result/3
                return result

a=9
b=18
c=27
mystuff=myclass(a, b, c)        
print mystuff.average()
13
cmoman

Jede Funktion in einer Klasse und jede Klassenvariable muss das Argument self wie angegeben annehmen.

class mystuff:
    def average(a,b,c): #get the average of three numbers
            result=a+b+c
            result=result/3
            return result
    def sum(self,a,b):
            return a+b


print mystuff.average(9,18,27) # should raise error
print mystuff.sum(18,27) # should be ok

Wenn Klassenvariablen beteiligt sind:

 class mystuff:
    def setVariables(self,a,b):
            self.x = a
            self.y = b
            return a+b
    def mult(self):
            return x * y  # This line will raise an error
    def sum(self):
            return self.x + self.y

 print mystuff.setVariables(9,18) # Setting mystuff.x and mystuff.y
 print mystuff.mult() # should raise error
 print mystuff.sum()  # should be ok
4
lmount

Versuche dies:

class mystuff:
    def average(_,a,b,c): #get the average of three numbers
            result=a+b+c
            result=result/3
            return result

#now use the function average from the mystuff class
print mystuff.average(9,18,27)

oder dieses:

class mystuff:
    def average(self,a,b,c): #get the average of three numbers
            result=a+b+c
            result=result/3
            return result

#now use the function average from the mystuff class
print mystuff.average(9,18,27)
1
Rob123

In python member function einer Klasse muss das Argument self explizit angegeben werden. Entspricht dem impliziten Zeiger this in C++. Weitere Informationen finden Sie unter this Seite.

1
Suraj

Sie müssen sich ein wenig mehr mit den Grundlagen der objektorientierten Programmierung befassen.

Das hört sich hart an, ist aber wichtig.

  • Ihre Klassendefinition ist falsch - obwohl die Syntax akzeptabel ist. Die Definition ist einfach falsch.

  • Ihre Verwendung der Klasse zum Erstellen eines Objekts fehlt vollständig.

  • Ihre Verwendung einer Klasse für eine Berechnung ist unangemessen. So etwas kann getan werden, aber es erfordert das fortgeschrittene Konzept eines @staticmehod.

Da Ihr Beispielcode in vielerlei Hinsicht falsch ist, können Sie diese Antwort nicht ordentlich korrigieren. Es gibt zu viele Dinge zu beheben.

Sie müssen sich bessere Beispiele für Klassendefinitionen ansehen. Es ist nicht klar, aus welchem ​​Quellenmaterial Sie lernen, aber welches Buch Sie lesen, ist entweder falsch oder unvollständig.

Bitte verwerfen Sie jedes Buch oder jede Quelle, die Sie verwenden, und finden Sie ein besseres Buch. Ernst. Sie haben Sie in die Irre geführt, wie eine Klassendefinition aussieht und wie sie verwendet wird.

Vielleicht möchten Sie sich http://homepage.mac.com/s_lott/books/nonprog/htmlchunks/pt11.html ansehen, um eine bessere Einführung in Klassen, Objekte und Python zu erhalten.

1
S.Lott