Значение в self не передается автоматически, туда попадает первый аргумент метода
Значение в self не передается автоматически и туда попадает значение первого аргумента метода. Из-за этого появляется ошибка нехватки аргументов. При этом я попробовал сделать подобный, но очень простой код, но ошибка повторилась.
Ответы (1 шт):
Быстрый ответ - называйте классы с большой буквы.
А вот что происходит у вас. Вы пытаетесь вызвать movement()
не для объекта класса player
, а как статический метод класса, хотя сам метод статическим не является. Вот маленький пример:
class A:
def foo(self, a, b):
print(a * b)
a = A()
a.foo(2, 3)
# -> 6
Этот код работает как и ожидалось. Но стоит мне написать так:
A.foo(2, 3)
как я получаю ошибку:
TypeError: A.foo() missing 1 required positional argument: 'b'
В Python действительно можно вызывать нестатические методы класса похожим образом, только нужно передать объект класса первым аргументом:
a = A()
A.foo(a, 2, 3)
Если же методу не нужно работать с экземпляром класса, то можно сделать метод статическим:
class A:
@staticmethod
def foo(a, b): # теперь нет аргумента self
print(a * b)
A.foo(2, 3)
Теперь объект для вызова этого метода необязателен, хотя вызывать его для объекта не запрещено.
А теперь вернемся к первому предложению ответа. Насколько я вижу, в коде вы называете переменные с маленькой буквы. В какой-то момент вы решили назвать так и класс и, вероятно, не заметили, что собственно объект класса то и не создали. Это отчасти и является причиной, почему стоит называть классы именно с большой буквы - чтобы отличать от переменных.