Unbound метод должен вызываться с экземпляром как первый аргумент - python

Я продолжаю получать ошибку: TypeError: unbound method get_num_students() must be called with Student instance as first argument (got nothing instead)

Вот код:

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

Вот вывод Python:

>>> 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)

Кроме того, если кто-то может мне помочь, он печатает студента как пространство в памяти, я также был бы признателен.

Ответы

Ответ 1

Похоже, вы хотели определить grad_early, get_num_students и get_grad_2013 как методы класса, но вместо этого вы объявили их как методы экземпляра.

Метод экземпляра - это метод, который, ну, принадлежит экземпляру класса.

Примером может быть

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"

Разница в том, что метод экземпляра будет работать   s = Студент()   s.print_name()

И метод класса будет работать над самим классом   Student.

Ответ 2

Различия в версии python 2 и 3:

Если у вас уже есть метод по умолчанию в классе с тем же именем, и вы повторно объявляете его как одноименное имя, он будет отображаться как вызов unbound-метода этого экземпляра класса, если вы хотите его создать.

Если вам нужны методы класса, но вместо этого вы объявили их как методы экземпляра.

Метод экземпляра - это метод, который используется, когда создается экземпляр класса.

Примером может быть

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

Метод метки класса:

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

В версиях python 2 и 3 отличается класс @classmethod для записи в python 3 он автоматически получает это как метод метки класса и не нужно писать @classmethod Я думаю, это может помочь вам.

Ответ 3

Когда вы определяете метод экземпляра, поместите a self в качестве первого аргумента метода, а когда вы его используете, добавьте self. перед вашей переменной экземпляра.

Как

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