webentwicklung-frage-antwort-db.com.de

ungebundene Methode muss mit Instanz als erstes Argument aufgerufen werden - Python

Ich erhalte weiterhin die Fehlermeldung: TypeError: unbound method get_num_students() must be called with Student instance as first argument (got nothing instead)

Hier ist der Code:

class Student(object):
    num_students = 0
    num_grad_2013 = 0

    def __init__(self, first_name, last_name, id_num, yr_of_grad, counselor):
        self = self
        self.first_name = first_name
        self.last_name = last_name
        self.id_num = int(id_num)
        self.yr_of_grad = int(yr_of_grad)
        self.counselor = counselor

    def to_string(first_name, last_name, id_num, yr_of_grad, counselor):
        print first_name
        print last_name
        print id_num
        print yr_of_grad
        print counselor


    def move():
        num_students -= 1
        if yr_of_grad == 12:
            num_grad_2013 -= 1
        else:
            None
        print "Student with ID number: %s has moved." % (id_num)

    def grad_early():
        num_students -= 1
        num_grad_2013 -= 1
        print "Student with ID number: %s is graduating early." % (id_num)

    def get_num_students():
        print "There are %s students in this school." % (num_students)

    def get_grad_2013():
        print "There are %s students graduating this year." % (num_grad_2013)

def main():
    print "Creating student Nathan Lindquist" 
    nathan = Student("Nathan", "Lindquist", 11111, 2014, "Iverson")
    print nathan 
    print "Creating student Dylan Schlact" 
    dylan = Student("Dylan", "Schlact", 22222, 2012, "Greene") 
    print dylan 
    print "Creating student Matt Gizzo" 
    matt = Student("Matt", "Gizzo", 33333, 2013, "Connor") 
    print matt 
    # so number of students is 3, one is graduating in 2013 
    Student.get_num_students() 
    Student.get_grad_2013() 
     # change some things! 
    nathan.grad_early() 
    print nathan 
    matt.move() 
    #matt.grad_early() 
    #print matt 
    # so number of students is 2, one is graduating in 2013 
    Student.get_num_students() 
    Student.get_grad_2013()
    return

Hier ist die Python-Ausgabe:

>>> main()
Creating student Nathan Lindquist
<__main__.Student object at 0x03065430>
Creating student Dylan Schlact
<__main__.Student object at 0x030653B0>
Creating student Matt Gizzo
<__main__.Student object at 0x030653D0>

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    main()
  File "C:\Users\admin\Desktop\Python\student.py", line 51, in main
    Student.get_num_students()
TypeError: unbound method get_num_students() must be called with Student instance as first argument (got nothing instead)

Wenn mir jemand dabei helfen könnte, den Schüler als Speicherplatz zu drucken, würde ich das auch begrüßen.

15
Rabid_Rooster

Es scheint, als wollten Sie grad_early, get_num_students und get_grad_2013 als Klassenmethoden definieren, aber Sie deklarierten sie stattdessen als Instanzmethoden.

Eine Instanzmethode ist eine Methode, die zu einer Instanz der Klasse gehört.

Ein Beispiel wäre 

class Student(object):
    # ...

    def print_name(self):  # This is an instance method
        print "executing instance method"

    @classmethod
    def num_of_students(cls)
        print "executing class method"

Der Unterschied ist, dass eine Instanzmethode mit .__ arbeitet. s = Student () s.print_name ()

Und eine Klassenmethode kann auf die Klasse selbst angewendet werden Student.

21
user2867522

Unterschiede in der In python 2- und 3-Version:

Wenn Sie bereits über eine Standardmethode in einer Klasse mit demselben Namen verfügen und Sie als denselben Namen erneut deklarieren, wird sie als Aufruf der ungebundenen Methode dieser Klasseninstanz angezeigt, wenn Sie sie instanziieren wollten. 

Wenn Sie Klassenmethoden wollten, haben Sie sie stattdessen als Instanzmethoden deklariert.

Eine Instanzmethode ist eine Methode, die verwendet wird, wenn eine Instanz der Klasse erstellt wird.

Ein Beispiel wäre 

   def user_group(self):   #This is an instance method
        return "instance method returning group"

Klassenetikettenmethode:

   @classmethod
   def user_group(groups):   #This is an class-label method
        return "class method returning group"

In Python 2 und 3 unterscheiden sich die Klassen der Klasse @classmethod In Python 3 wird dies automatisch als Klassenlabel-Methode verwendet und es ist nicht erforderlich, @classmethod .__ zu schreiben. Ich denke, das könnte Ihnen helfen.

1
Projesh Bhoumik