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)