Что такое self в Python?

Ответ

self — это первый параметр методов экземпляра класса в Python. Это ссылка на конкретный экземпляр объекта, для которого вызывается метод. Через self метод получает доступ к атрибутам и другим методам этого объекта.

Зачем это нужно:

  • Python не делает этого автоматически. Явное указание self делает работу с атрибутами экземпляра предсказуемой.
  • Позволяет отличать атрибуты экземпляра от локальных переменных метода и атрибутов класса.

Пример:

class User:
    # Атрибут класса
    platform = "MyApp"

    def __init__(self, name, age):
        # self.name — атрибут экземпляра
        self.name = name
        self.age = age

    def introduce(self):
        # Обращение к атрибуту экземпляра через self
        return f"Меня зовут {self.name}, мне {self.age} лет. Я с платформы {self.platform}."

# Создаем экземпляры
user1 = User("Анна", 30)
user2 = User("Петр", 25)

print(user1.introduce()) # self внутри introduce ссылается на user1
print(user2.introduce()) # self внутри introduce ссылается на user2

Важно: Название self — это соглашение, а не строгое правило языка, но его повсеместно используют и настоятельно рекомендуют придерживаться.

Ответ 18+ 🔞

А, ну вот, опять про этот self! Давай разберёмся, что за хуйня такая, а то новички каждый раз охуевают, когда видят его в каждом методе.

Представь, что класс — это чертёж дома, а экземпляр — это реальный, построенный дом. Так вот, self — это твой личный пропуск внутрь конкретного дома, чтобы ты мог там свою мебель расставить или картины на стену повесить. Без этого пропуска ты будешь тыкаться в общую схему, а не в свою квартиру.

И зачем это, ёпта, нужно?

  • Python — язык не телепатический, ему надо явно показать, с каким именно объектом ты сейчас работаешь. Вот этот self и есть тот самый явный пинок: «Работай вот с ЭТИМ!».
  • Без него вообще пиздец начнётся: не поймёшь, где атрибут конкретного экземпляра, а где просто переменная в методе болтается или общая для всех фигня из класса.

Смотри, как это выглядит на практике:

class User:
    # Это как общий подъезд — для всех жильцов один
    platform = "MyApp"

    def __init__(self, name, age):
        # А вот это уже личная квартира. self.name — твоя личная табличка на двери.
        self.name = name
        self.age = age

    def introduce(self):
        # И тут self говорит: «Бери имя и возраст ИЗ СВОЕЙ КВАРТИРЫ, а не у соседа!»
        return f"Меня зовут {self.name}, мне {self.age} лет. Я с платформы {self.platform}."

# Строим два дома по одному чертежу
user1 = User("Анна", 30)  # В этом доме живёт Анна
user2 = User("Петр", 25)  # А в этом — Петр

print(user1.introduce()) # Тут self внутри — это user1. Анна говорит о себе.
print(user2.introduce()) # А тут self — это уже user2. Петр о себе.

Самое главное, что тебя, наверное, ебёт: название self — это просто святое соглашение, как крестик на шее. Можно назвать его this, myself или даже хрюндель, но если ты так сделаешь — ты пидарас шерстяной. Все используют self, и все тебя сразу поймут. Не выёбывайся, называй self.