Сеттеры и геттеры

В Python геттеры и сеттеры — это методы для получения (get) и установки (set) значений атрибутов объекта, часто с дополнительной логикой проверки, валидации или вычислений.

В отличие от Java или C#, в Python их обычно реализуют через @property и @<property>.setter, чтобы сохранять красивый доступ через точку, но при этом иметь возможность вставить логику.


1. Классический (непитонический) способ — явные методы

class Person:
    def __init__(self, name):
        self._name = name  # защищённый атрибут

    def get_name(self):
        return self._name

    def set_name(self, new_name):
        if not new_name:
            raise ValueError("Имя не может быть пустым")
        self._name = new_name

p = Person("Иван")
print(p.get_name())  # Иван
p.set_name("Мария")

📌 Недостаток — в Python так почти не делают, потому что это похоже на Java-стиль.


2. Питонический способ — @property и @<property>.setter

class Person:
    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        """Геттер"""
        return self._name

    @name.setter
    def name(self, value):
        """Сеттер"""
        if not value:
            raise ValueError("Имя не может быть пустым")
        self._name = value

p = Person("Иван")
print(p.name)   # Иван (геттер вызывается как атрибут)
p.name = "Мария"  # Сеттер

📌 Плюсы:

  • Читается как обычный атрибут (obj.name), но внутри — логика.

  • Можно в любой момент добавить проверки, не меняя интерфейс класса.


3. Только геттер (read-only свойство)

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def diameter(self):
        return self._radius * 2

c = Circle(5)
print(c.diameter)  # 10
# c.diameter = 20  # Ошибка: нет сеттера

📌 Используется, когда свойство вычисляется и не должно напрямую изменяться.


4. Пример из автоматизации тестирования

В Page Object Model часто делают геттер для локаторов, чтобы не хранить их как константы и иметь возможность вычислять динамически.

class LoginPage:
    def __init__(self, driver):
        self.driver = driver

    @property
    def username_field(self):
        return self.driver.find_element(By.ID, "username")

    @username_field.setter
    def username_field(self, value):
        field = self.driver.find_element(By.ID, "username")
        field.clear()
        field.send_keys(value)

Использование:

login_page.username_field = "test_user"  # сеттер

Last updated

Was this helpful?