← Назад к вопросам

Что такое self?

1.0 Junior🔥 241 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое self

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

Основные моменты

self — не ключевое слово, это просто соглашение и параметр функции. Его можно назвать иначе (например, obj или instance), но это считается плохой практикой и наносит ущерб читаемости кода.

Как это работает

class Dog:
    def __init__(self, name):
        self.name = name  # self ссылается на конкретный экземпляр
    
    def bark(self):
        print(f"{self.name} говорит: Гав!")

# Создание экземпляра
dog1 = Dog("Шарик")
dog2 = Dog("Бобик")

# Вызов метода
dog1.bark()  # Шарик говорит: Гав!
dog2.bark()  # Бобик говорит: Гав!

Когда мы вызываем dog1.bark(), Python автоматически передаёт dog1 как первый аргумент (self) в метод bark(). То есть это эквивалентно:

dog1.bark()  # Python преобразует в:
Dog.bark(dog1)  # явная передача экземпляра

self и атрибуты экземпляра

class Person:
    species = "Человек"  # атрибут класса — общий для всех
    
    def __init__(self, name, age):
        self.name = name      # атрибут экземпляра — уникален для каждого
        self.age = age
    
    def get_info(self):
        return f"{self.name}, {self.age} лет, вид: {self.species}"

person1 = Person("Иван", 30)
person2 = Person("Мария", 25)

print(person1.get_info())  # Иван, 30 лет, вид: Человек
print(person2.get_info())  # Мария, 25 лет, вид: Человек

self в особых методах

init (конструктор)

class Car:
    def __init__(self, brand):
        self.brand = brand  # инициализация атрибутов

str и repr

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __str__(self):
        return f"Point({self.x}, {self.y})"

Методы доступа (getters/setters)

class Temperature:
    def __init__(self, celsius):
        self._celsius = celsius
    
    @property
    def fahrenheit(self):
        return self._celsius * 9/5 + 32

Отличие от class методов и static методов

class Example:
    class_var = "класс"
    
    def instance_method(self):
        # self — экземпляр, может менять self.attr
        return f"Метод экземпляра: {self.class_var}"
    
    @classmethod
    def class_method(cls):
        # cls — сам класс, может менять cls.class_var
        return f"Метод класса: {cls.class_var}"
    
    @staticmethod
    def static_method():
        # нет ни self, ни cls — это просто функция
        return "Статический метод"

ex = Example()
print(ex.instance_method())      # Метод экземпляра: класс
print(Example.class_method())    # Метод класса: класс
print(Example.static_method())   # Статический метод

Почему self нужен

  1. Различие состояния: каждый экземпляр имеет свои данные
  2. Доступ к атрибутам: методы могут читать/изменять данные объекта
  3. Инкапсуляция: методы работают с приватными и защищённными атрибутами
  4. Полиморфизм: разные экземпляры вызывают переопределённые методы

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

# ❌ Забыли self в методе
class Bad:
    def method():
        print("Ошибка!")

# ✅ Правильно
class Good:
    def method(self):
        print("Правильно!")

# ❌ Вызов без экземпляра в обычном методе
Class.method()  # TypeError: method() missing 1 required positional argument: self

# ✅ Вызов с экземпляром
obj = Class()
obj.method()  # Работает

self — фундаментальная концепция объектно-ориентированного программирования в Python, которая обеспечивает связь между методом и его объектом.

Что такое self? | PrepBro