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

Для чего нужен self в Python?

2.0 Middle🔥 172 комментариев
#Автоматизация тестирования

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

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

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

Назначение self в Python

Ключевое слово self в Python — это первый параметр методов класса, представляющий экземпляр (объект) класса, от имени которого вызывается метод. Это не магическое слово, а общепринятое соглашение: вместо self можно использовать любое другое имя (например, this или obj), но следование конвенции self критически важно для читаемости кода.

Основные функции self

  • Доступ к атрибутам и методам экземпляра: Через self метод получает доступ к переменным экземпляра (self.attribute) и другим методам этого же объекта (self.other_method()). Без self переменная внутри метода считалась бы локальной.
  • Модификация состояния объекта: self позволяет изменять состояние конкретного экземпляра. Изменения, сделанные через self.attribute = value, будут уникальны для этого объекта.
  • Отличия от статических и классовых методов: Использование self явно указывает, что метод является методом экземпляра (instance method), в отличие от:
    *   `@classmethod`, где первый параметр — `cls` (ссылкой на сам класс).
    *   `@staticmethod`, который не принимает ни `self`, ни `cls`.

Практический пример

Рассмотрим код, демонстрирующий важность self:

class Car:
    # Атрибут класса (общий для всех экземпляров)
    wheels = 4

    def __init__(self, brand, model):
        # Атрибуты экземпляра (уникальны для каждого объекта)
        self.brand = brand  # self обеспечивает привязку к конкретному объекту
        self.model = model
        self.is_running = False  # Инициализация состояния

    def start_engine(self):
        """Метод экземпляра: изменяет состояние конкретного объекта."""
        self.is_running = True
        print(f"Двигатель {self.brand} {self.model} заведен.")

    def get_info(self):
        """Метод экземпляра: читает атрибуты конкретного объекта."""
        return f"{self.brand} {self.model}, колес: {self.wheels}, работает: {self.is_running}"

    @classmethod
    def change_wheels_count(cls, new_count):
        """Классовый метод: изменяет атрибут КЛАССА."""
        cls.wheels = new_count

    @staticmethod
    def check_fuel_type(fuel):
        """Статический метод: не имеет доступа ни к self, ни к cls."""
        return fuel in ["petrol", "diesel", "electric"]

# Создаем два экземпляра
car1 = Car("Toyota", "Camry")
car2 = Car("Tesla", "Model 3")

# Использование self для управления состоянием каждого объекта
car1.start_engine()  # self внутри start_engine будет ссылаться на car1
print(car1.get_info())  # Toyota Camry, колес: 4, работает: True
print(car2.get_info())  # Tesla Model 3, колес: 4, работает: False

# Изменяем атрибут класса (затрагивает все экземпляры)
Car.change_wheels_count(6)
print(car1.get_info())  # Toyota Camry, колес: 6, работает: True
print(car2.get_info())  # Tesla Model 3, колес: 6, работает: False

Что произойдет без self?

Если объявить метод без self, Python интерпретирует его как обычную функцию, не привязанную к экземпляру, что приведет к ошибкам:

class IncorrectExample:
    def set_value(value):
        # Где хранить value? Нет ссылки на объект!
        stored_value = value  # Это локальная переменная, она исчезнет после вызова

obj = IncorrectExample()
obj.set_value(10)  # TypeError: set_value() takes 1 positional argument but 2 were given
# Python автоматически передает объект (obj) в качестве первого аргумента,
# но метод не ожидает его, отсюда и ошибка.

Итог для QA Engineer

Понимание self важно не только для написания, но и для чтения и анализа кода при тестировании:

  1. Поиск дефектов: Некорректное использование self (например, его пропуск или путаница с cls) — частый источник ошибок, которые нужно уметь идентифицировать.
  2. Анализ состояния: Тестируя методы, вы должны четко понимать, меняют ли они состояние конкретного объекта (через self) или влияют на все объекты класса (через cls).
  3. Написание автотестов: При создании Page Object Model или других объектов в UI-тестах вы постоянно работаете с self для хранения элементов страницы и их состояния.

Таким образом, self — это механизм, обеспечивающий инкапсуляцию и работу с состоянием отдельных объектов, что является краеугольным камнем объектно-ориентированного программирования в Python. Для QA-инженера это базовое знание, необходимое для эффективного взаимодействия с кодом продукта и тестовыми фреймворками.