Ошибка Python TypeError: missing 1 required positional argument: ‘self’ обычно возникает, если вы вызываете метод непосредственно на классе - а не на экземпляре этого класса.
Вот как выглядит ошибка:
Traceback (most recent call last):
File /dwd/sandbox/test.py, line 9, in <module>
print(movie.get_title())
^^^^^^^^^^^^^^^^^
TypeError: Movie.get_title() missing 1 required positional argument: self
Когда вы вызываете метод на объекте Python, в качестве первого аргумента ему неявно передается параметр (условно названный self).
Параметр self представляет собой состояние объекта и эквивалентен ключевому слову this в JavaScript, PHP и C++.
Поэтому всегда следует резервировать первый параметр нестатических методов для экземпляра объекта.
class Movie:
# self defined as the first parameter for the constructor
def __init__ (self, name):
self.name = name
def get_title(self):
return self.name
В отличие от аргументов ключевых слов, в Python порядок позиционных аргументов имеет значение, и вам придется передавать их соответствующему методу в том порядке, в котором они определены.
Если вы вызовете метод get_title() непосредственно на классе Movie, экземпляр объекта (self) не будет передан ему. А поскольку он ожидает его, Python выдаст ошибку “TypeError: missing 1 required positional argument: ‘self’”.
Чтобы исправить это, инстанцируйте класс и вызовите свой метод на инстанцированном объекте. И ошибка исчезнет.
В качестве альтернативы вы можете использовать статические методы, если вам не нужен параметр self.
Давайте разберемся немного глубже.
Как исправить отсутствие 1 необходимого позиционного аргумента: ‘self’
Как упоминалось ранее, есть два варианта исправления ошибки:
Инстанцировать класс
Использовать статические методы
Давайте рассмотрим каждый подход на примерах.
Инстанцировать класс: Параметр self передается методам только в том случае, если они вызываются на объекте. Тем не менее, вы можете исправить ошибку, инстанцировав класс и вызвав метод на экземпляре объекта.
class Movie:
def __init__ (self, name):
self.name = name
def get_title(self):
return self.name
movie = Movie()
print(movie.get_title())
Или без хранения экземпляра объекта в переменной:
# Instantiating the class without storing the instance
print(Movie().get_title())
Используйте статические методы: Если в вашем методе нет ссылки на параметр self, вы можете сделать его статическим. В результате вы сможете вызывать его непосредственно в классе:
class Movie:
def __init__ (self, name):
self.name = name
@staticmethod
def play_movie():
return 'playing ...'
print(Movie.play_movie())
Обратите внимание, что вам необходимо удалить self в определении метода. В противном случае метод будет продолжать ожидать параметр self.
Вот так можно исправить ошибку этого типа! Надеюсь, это краткое руководство помогло вам решить проблему.
Спасибо за прочтение.