self в Python: что это за параметр и зачем он нужен в методах

Параметр self получает объект, у которого вызвали метод: запись rex.bark() Python выполняет как Dog.bark(rex).

Показываем на рабочем коде, зачем self пишут явно, чем он отличается от cls и this и как разобрать пять типичных ошибок вроде «missing 1 required positional argument: 'self'».

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3267 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3921 экспертное мнение Подписаться на Телеграм-канал
Обложка: self в Python: что это за параметр и зачем он нужен в методах

self в Python — первый параметр метода, через который метод получает объект, у которого его вызвали. Передавать его руками не нужно: когда вы пишете rex.bark(), Python сам вызывает Dog.bark(rex) и кладёт rex в self. Через self.name метод читает и меняет данные именно этого объекта, а не соседнего.

Слово self не входит в список ключевых, это обычное имя параметра. Но PEP 8 требует писать именно его. Если классы пока в новинку, начните с разбора ООП на Python: там по порядку объяснено, что такое класс, объект и атрибут.

CheckroiCheckroiПодборка курсов по Python575 курсов • 53 школыСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Как работает self на примере

Рой за ноутбуком разбирает класс на Python

Возьмём класс с двумя собаками. Метод bark у них один на двоих, а клички разные.

class Dog:
    def __init__(self, name):
        self.name = name

    def bark(self):
        return f"{self.name}: Гав!"


rex = Dog("Рекс")
bim = Dog("Бим")

print(rex.bark())
print(bim.bark())
print(Dog.bark(rex))

Строку в bark собирает f-строка: в фигурные скобки подставляется значение self.name. Вывод:

Рекс: Гав!
Бим: Гав!
Рекс: Гав!

Что происходит, когда вы пишете rex.bark():

  1. Python ищет bark и находит его в классе Dog, а не в самом объекте.
  2. Метод вызван через rex, поэтому интерпретатор подставляет rex первым аргументом.
  3. Внутри метода self указывает на rex, и self.name даёт «Рекс».
  4. При вызове bim.bark() тот же код получает в self другой объект и возвращает «Бим».

Третья строка вывода показывает тот же вызов в развёрнутом виде: Dog.bark(rex) передаёт объект явно. В учебнике Python сказано то же самое: вызов x.f() полностью совпадает с MyClass.f(x).

Во всём остальном self ведёт себя как обычный параметр функции. Необычен только способ передачи: объект в него подставляет точка в записи объект.метод().

self в __init__: где хранятся данные объекта

Метод __init__ запускается при создании объекта, и self в нём указывает на объект, который только что появился. Всё, что вы запишете через self.атрибут, останется в объекте и после выхода из метода.

Без self. присваивание создаёт локальную переменную. Она исчезает, как только метод закончил работу:

class Wallet:
    def __init__(self, balance):
        self.balance = balance

    def add_wrong(self, amount):
        balance = self.balance + amount

    def add(self, amount):
        self.balance = self.balance + amount


w = Wallet(100)
w.add_wrong(50)
print(w.balance)
w.add(50)
print(w.balance)
100
150

Метод add_wrong посчитал сумму и тут же её потерял. Ошибки нет, а баланс не изменился, и программа спокойно работает дальше. Такой баг легко пропустить при проверке.

В FAQ по устройству Python это одна из причин явного self. Локальные переменные и атрибуты объекта живут в двух разных пространствах имён, и Python нужно сказать, в какое из них писать.

Посмотреть, что лежит в объекте, можно функцией vars():

class Dog:
    def __init__(self, name):
        self.name = name
        self.tricks = []


rex = Dog("Рекс")
rex.tricks.append("сидеть")
print(vars(rex))
{'name': 'Рекс', 'tricks': ['сидеть']}

Атрибуты бывают двух видов, и путать их не стоит:

Где объявлен Как записан Чей
в методе через self self.name = name свой у каждого объекта
в теле класса sound = "гав" общий для всех объектов класса

Как спрятать такие данные от внешнего кода, рассказано в разделе про инкапсуляцию в статье о принципах ООП.

Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Почему self в Python пишут явно

Каждый объект класса хранит свои данные

В Java и C++ ссылка на текущий объект называется this и доступна внутри метода без объявления. Python устроен иначе: объект приходит обычным параметром, и его видно в сигнатуре каждого метода.

Python Java, C++
Имя self, договорённость this, ключевое слово
Объявляется в методе да, первым параметром нет
Обращение к полю объекта только self.name можно просто name

В JavaScript this тоже не объявляют, но к полю, как и в Python, обращаются только через this.name.

Зачем так сделано, разработчики объясняют в официальном FAQ. Идею позаимствовали из языка Modula-3, а доводы такие:

  • Читаемость. По записи self.x сразу видно, что это атрибут объекта, а не локальная переменная, даже если определение класса вы не помните наизусть.
  • Вызов метода родителя. Метод базового класса вызывается как обычная функция, Base.method(self, ...), и особый синтаксис вроде :: из C++ не нужен.
  • Присваивание. Объявлений переменных в Python нет, поэтому интерпретатору нужен знак, что значение пишется в объект. Этим знаком служит self. перед именем.

Можно ли назвать self по-другому

Можно. Для интерпретатора это обычное имя параметра, и синтаксис Python его выбор не ограничивает. Класс с this работает точно так же:

class Dog:
    def __init__(this, name):
        this.name = name

    def bark(this):
        return f"{this.name}: Гав!"


print(Dog("Рекс").bark())
Рекс: Гав!

В учебнике Python про это имя сказано прямо: «Это всего лишь общепринятая договорённость: имя self не имеет никакого особого значения в Python». Там же оговорка: другим программистам такой код может быть труднее читать.

Стандарт оформления PEP 8 требует всегда называть первый аргумент обычного метода self, а первый аргумент метода класса называть cls. Переименовывать не стоит: коллега, открыв ваш класс, будет каждый раз гадать, откуда взялся this.

self, cls и методы без них

Не каждому методу нужен объект. Видов методов в Python три, и первый параметр у них разный:

Вид метода Декоратор Первый параметр Когда нужен
обычный, метод экземпляра нет self, объект работа с данными конкретного объекта
метод класса @classmethod cls, сам класс другие способы создать объект, общие настройки класса
статический @staticmethod нет вспомогательная функция, которой не нужны ни объект, ни класс

Все три вида в одном классе:

class Temperature:
    scale = "Цельсий"

    def __init__(self, degrees):
        self.degrees = degrees

    def show(self):
        return f"{self.degrees} °C"

    @classmethod
    def from_fahrenheit(cls, f):
        return cls(round((f - 32) * 5 / 9, 1))

    @staticmethod
    def is_freezing(degrees):
        return degrees <= 0


t = Temperature.from_fahrenheit(100)
print(t.show())
print(Temperature.is_freezing(-5))
print(t.scale)
37.8 °C
True
Цельсий

Метод from_fahrenheit получает в cls класс Temperature и создаёт через него объект. Если вызвать этот метод у класса-наследника, в cls придёт наследник, и объект получится его типа. Оба декоратора описаны в документации: classmethod и staticmethod.

self при наследовании

В наследнике self указывает на объект наследника, даже если код метода написан в родителе. Поэтому describe из класса Animal вызывает sound кошки:

class Animal:
    def __init__(self, name):
        self.name = name

    def describe(self):
        return f"{self.name} говорит {self.sound()}"

    def sound(self):
        return "..."


class Cat(Animal):
    def sound(self):
        return "мяу"


print(Cat("Мурка").describe())
Мурка говорит мяу

На этом построен полиморфизм: родитель задаёт общий порядок действий, наследники подменяют отдельные шаги. Версию метода из родителя вызывают через super().sound() или явно, Animal.sound(self).

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 800 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Зачем методу возвращать self

Метод может отдать сам объект через return self. Тогда вызовы удобно писать цепочкой:

class Query:
    def __init__(self):
        self.parts = []

    def where(self, condition):
        self.parts.append(condition)
        return self

    def build(self):
        return " AND ".join(self.parts)


sql = Query().where("age > 18").where("city = 'Казань'").build()
print(sql)
age > 18 AND city = 'Казань'

Каждый where дописывает условие в тот же объект и передаёт его следующему вызову. Во встроенных типах Python так почти не делают: методы, которые меняют объект на месте, возвращают None. Так устроен, например, метод sort() у списка.

Частые ошибки с self

Рой доволен: программа заработала без ошибок

Ниже пять ошибок, которые новички встречают чаще всего. Трейсбеки сняты в Python 3.14, путь к файлу сокращён до имени main.py.

Забыли self в объявлении метода

class Dog:
    def bark():
        return "Гав!"


Dog().bark()
Traceback (most recent call last):
  File "main.py", line 6, in <module>
    Dog().bark()
    ~~~~~~~~~~^^
TypeError: Dog.bark() takes 0 positional arguments but 1 was given

Python передал объект первым аргументом, а принять его метод не может: параметров у него ноль.

Решение: добавить self первым параметром, def bark(self):.

Вызвали метод у класса, а не у объекта

Traceback (most recent call last):
  File "main.py", line 9, in <module>
    Dog.bark()
    ~~~~~~~~^^
TypeError: Dog.bark() missing 1 required positional argument: 'self'

Здесь класс тот же, что в первом примере статьи, но вызов идёт через Dog, а не через собаку. Подставлять в self нечего.

Решение: сначала создать объект, Dog("Рекс").bark(). Если методу объект и правда не нужен, сделайте его статическим.

Обратились к атрибуту без self

Traceback (most recent call last):
  File "main.py", line 9, in <module>
    Dog("Рекс").bark()
    ~~~~~~~~~~~~~~~~^^
  File "main.py", line 6, in bark
    return f"{name}: Гав!"
              ^^^^
NameError: name 'name' is not defined. Did you mean: 'self.name'?

Внутри метода написали name вместо self.name. Подсказку «Did you mean: ‘self.name’?» интерпретатор выводит начиная с Python 3.12, в старых версиях будет только первая половина сообщения.

Решение: писать self.name везде, где нужен атрибут объекта.

Вызвали соседний метод без self

Traceback (most recent call last):
  File "main.py", line 12, in <module>
    Dog("Рекс").greet()
    ~~~~~~~~~~~~~~~~~^^
  File "main.py", line 9, in greet
    return bark()
           ^^^^
NameError: name 'bark' is not defined. Did you mean: 'self.bark'?

Метод greet вызвал bark() как обычную функцию. Но методы лежат в классе, и без self. Python ищет функцию с таким именем снаружи.

Решение: return self.bark().

Использовали self в теле класса

class Dog:
    sound = self.name
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    class Dog:
        sound = self.name
  File "main.py", line 2, in Dog
    sound = self.name
            ^^^^
NameError: name 'self' is not defined

self существует только внутри метода, пока его вызывают. В теле класса объекта ещё нет, ссылаться не на что.

Решение: перенести присваивание в __init__: self.sound = .... Перехватывать такие ошибки во время работы программы помогает конструкция try except, но опечатку с self правят в самом коде: обработчик её только спрячет.

Где освоить Python системно

Разобраться с self по одной статье можно за вечер. Проектировать классы для настоящей программы учатся дольше: на задачах, ревью кода и собственных проектах. Если вы смотрите на Python как на работу, загляните в обзор профессии Python-разработчика.

Ниже курсы по Python из нашего каталога. Их можно сравнить по цене и длительности.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Профессия «Python-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология137 000 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 754 ₽4108 ₽/мес.9 месяцевОбзор курса
Профессия Python-разработчик
Перейти на сайт курса
SkillFactorySkillFactory140 040 ₽3890 ₽/мес.10 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Что такое self в Python простыми словами?

Это первый параметр метода, в который Python подставляет объект, у которого метод вызвали. Запись rex.bark() интерпретатор выполняет как Dog.bark(rex), поэтому внутри метода self.name означает кличку именно этой собаки.

self — это ключевое слово Python?

Нет. Это обычное имя параметра, и код с другим именем тоже заработает. Но стандарт оформления PEP 8 требует называть первый аргумент метода экземпляра self, поэтому так пишут все.

Чем self отличается от cls?

В self приходит объект, в cls приходит сам класс. cls используют в методах с декоратором @classmethod, например чтобы создать объект другим способом: Temperature.from_fahrenheit(100).

Чем self в Python отличается от this в Java?

В Java this доступен в методе без объявления, а к полю можно обратиться просто по имени. В Python self объявляют первым параметром каждого метода, а к атрибуту обращаются только через self.name.

Что значит ошибка «missing 1 required positional argument: 'self'»?

Метод вызвали у класса, а не у объекта, например Dog.bark(). Подставлять в self нечего. Создайте объект и вызовите метод у него: Dog("Рекс").bark().

Нужен ли self в статическом методе?

Нет. Метод с декоратором @staticmethod не получает ни объект, ни класс, поэтому self в нём не пишут. Если методу понадобились данные объекта, он должен быть обычным методом с self.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!