Значение в 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) 

Теперь объект для вызова этого метода необязателен, хотя вызывать его для объекта не запрещено.


А теперь вернемся к первому предложению ответа. Насколько я вижу, в коде вы называете переменные с маленькой буквы. В какой-то момент вы решили назвать так и класс и, вероятно, не заметили, что собственно объект класса то и не создали. Это отчасти и является причиной, почему стоит называть классы именно с большой буквы - чтобы отличать от переменных.

→ Ссылка