El método no vinculado se debe llamar con la instancia como primer argumento – python

Sigo recibiendo el error: TypeError: unbound method get_num_students() must be called with Student instance as first argument (got nothing instead)

Aquí está el código:

 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 

Aquí está la salida de Python:

 >>> main() Creating student Nathan Lindquist  Creating student Dylan Schlact  Creating student Matt Gizzo  Traceback (most recent call last): File "", line 1, in  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) 

Además, si alguien pudiera ayudarme a imprimir al alumno como un espacio en la memoria, también lo agradecería.

Parece que querías definir grad_early , get_num_students y get_grad_2013 como métodos de clase, pero en su lugar los declaraste como métodos de instancia.

Un método de instancia es un método que, bueno, pertenece a una instancia de la clase.

Un ejemplo sería

 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" 

La diferencia es que un método de instancia funcionará en s = Student () s.print_name ()

Y un método de clase funcionará en la propia clase de Estudiante.

Diferencias en la versión de Python 2 y 3:

Si ya tiene un método predeterminado en una clase con el mismo nombre y vuelve a declararlo con el mismo nombre, aparecerá como una llamada de método no enlazado de esa instancia de clase cuando desee instanciarlo.

Si quería métodos de clase, pero en su lugar los declaró como métodos de instancia.

Un método de instancia es un método que se utiliza cuando se crea una instancia de la clase.

Un ejemplo sería

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

Método de etiqueta de clase:

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

En Python 2 y 3, la versión difiere de la clase @classmethod para escribir en python 3, se obtiene automáticamente como un método de etiqueta de clase y no es necesario escribir @classmethod. Creo que esto puede ser útil.

Cuando defina un método de instancia, coloque un self como primer argumento del método, y cuando lo use, agregue self. delante de su variable de instancia.

Me gusta:

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