Как в Python создать getter для атрибута класса

Ответ

В Python для создания getter'а (метода для получения значения) используется декоратор @property. Этот подход позволяет обращаться к методу как к обычному атрибуту, без вызова скобок (), что делает код более чистым и интуитивным.

Основная цель — инкапсулировать внутреннее состояние объекта, предоставляя контролируемый доступ к нему.

Пример:

class Account:
    def __init__(self, owner, balance):
        self.owner = owner
        self._balance = balance  # "Защищенный" атрибут

    @property
    def balance(self):
        """Это getter для атрибута _balance."""
        print("Getter called")
        return self._balance

# Использование
acc = Account("Alice", 1000)

# Обращаемся как к атрибуту, а не как к методу acc.balance()
current_balance = acc.balance 
# Вывод: Getter called

print(current_balance)
# Вывод: 1000

Ключевые моменты:

  1. Декоратор @property превращает метод balance(self) в свойство balance, доступное только для чтения.
  2. Соглашение об именовании: Внутренний атрибут часто называют с префиксом _ (например, _balance), чтобы показать, что он не предназначен для прямого доступа извне. Публичное свойство (balance) предоставляет к нему доступ.
  3. Чистый интерфейс: Если в будущем логика получения баланса усложнится (например, потребуется пересчет с учетом комиссии), интерфейс для пользователя (acc.balance) не изменится.

Ответ 18+ 🔞

Да ты посмотри, какой красивый механизм, блядь! В Python, чтобы сделать этот самый getter — метод, который значение отдаёт, — используют декоратор @property. Это ж просто ёперный театр, а не фича!

Смысл в чём, блядь? Ты делаешь метод, но обращаешься к нему потом как к обычному полю, без этих дурацких скобок (). Код сразу становится чистый, как слеза младенца, и понятный, блядь. А главное — ты инкапсулируешь, сука, состояние объекта, и доступ к нему теперь под контролем, а не какой попало.

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

class Account:
    def __init__(self, owner, balance):
        self.owner = owner
        self._balance = balance  # А это, блядь, наш "спрятанный" атрибут, с подчёркиванием

    @property
    def balance(self):
        """Это getter для атрибута _balance."""
        print("Getter called")
        return self._balance

# Используем
acc = Account("Alice", 1000)

# И вот тут магия, блядь! Обращаемся как к атрибуту, а не как к методу acc.balance()
current_balance = acc.balance 
# Напечатает: Getter called

print(current_balance)
# Вывод: 1000

А теперь, блядь, ключевые моменты, чтобы не облажаться:

  1. Декоратор @property — это волшебная палочка, сука. Он берёт метод balance(self) и превращает его в свойство balance, которое только читать можно.
  2. Именование, ёпта! Внутреннюю переменную называем с подчёркиванием (_balance), типа намёк: "не лезь сюда, нахер, напрямую". А публичное свойство (balance) — это уже цивилизованный выход к данным.
  3. Чистота интерфейса — это сила, блядь! Захотелось тебе завтра баланс не просто отдавать, а, там, с комиссией его вычитать перед показом — так ты внутри геттера логику поменяешь, а снаружи все эти acc.balance будут работать как ни в чём не бывало. Красота, в рот меня чих-пых!