web-dev-qa-db-fra.com

méthode non liée doit être appelée avec instance comme premier argument - python

Je continue à recevoir l'erreur: TypeError: unbound method get_num_students() must be called with Student instance as first argument (got nothing instead)

Voici le 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

Voici la sortie 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)

De plus, si quelqu'un pouvait m'aider à imprimer l'étudiant comme un espace en mémoire, je l'apprécierais également.

15
Rabid_Rooster

Il semble que vous vouliez définir grad_early, get_num_students et get_grad_2013 en tant que méthodes de classe, mais vous les avez déclarés en tant que méthodes d'instance.

Une méthode d'instance est une méthode qui appartient à une instance de la classe.

Un exemple serait 

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 différence est qu'une méthode d'instance fonctionnera sur s = étudiant () s.print_name ()

Et une méthode de classe fonctionnera sur la classe elle-même Étudiant.

21
user2867522

Différences entre les versions In python 2 et 3:

Si vous avez déjà une méthode par défaut dans une classe portant le même nom et que vous déclarez de nouveau sous le même nom, elle apparaîtra comme un appel à une méthode non liée de cette instance de classe lorsque vous voudriez l'instancier. 

Si vous vouliez des méthodes de classe, mais que vous les déclariez comme méthodes d'instance.

Une méthode d'instance est une méthode utilisée pour créer une instance de la classe.

Un exemple serait 

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

Méthode d'étiquette de classe:

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

Dans python 2 et 3, la classe @classmethod diffère pour écrire En python 3, elle est automatiquement désignée comme méthode de classe et n'a pas besoin d'écrire @classmethod Je pense que cela pourrait vous aider.

1
Projesh Bhoumik