Безкоштовна онлайн-конференцiя з Python від fwdays. 14 грудня. Реєструйся!
×Закрыть

Про mutator method

Чи можете на пальцях пояснити про mutator method, setters, getters на прикладі Python? В чому їх смисл і коли їх використовувати?

LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

ось що бува, якщо одразу починати вчити скриптову мову програмування.

Я в Data Science 3 роки використовую Python. Натрапив на цей чудернацький метод, думаю треба воно мені чи ні?

якщо вам не треба ООП, то не потрiбнi його фiчi.
якось так.
Сiшники теж не використовують гетери\сетери

Концептуально, это для инкапсуляции данных: скрыть реализацию внутренностей класса за его АПИ. Причины: открытое АПИ меняется реже, чем внутренняя реализация; проще понять небольшое открытое АПИ, чем всю потенциально большую сложную реализацию класса: и т.д..
Да, Python дает прямой доступ ко всем полям класса/объекта, но концепция инкапсуляции все равно остается полезной, хотя бы, например, чтобы добавить проверку на допустимость значения при присвоении полю значения, или на создание копии возвращаемого поля вместо оригинала, и т.п.
Говоря же непосредственно о getter/setter, в Python предпочтительней использовать property, хотя сути это не меняет, так как все равно обеспечит инкапсуляцию (по крайней мере до той поры, пока кому-то не понадобится явно ее обойти).

Дякую.
Тобто інкапсуляція робиться для того щоб для зовнішнього користувача закрити деякі властивості об’єкту, які йому не варто використовувати?
Про getter/setter досі не зрозуміло. Це аналог return і присвоєнню = для інкапсуляції?

Да, один из элементов инкапсуляции. В частности, это позволяет выполнить защитное копирование, проверку на соответствие допустимому диапазону и т.п.:

def set_colors(self, colors):
  self.colors = colors[:]

Но в Python лучше использовать property. Они обеспечивают такую же инкапсуляцию, но больше подходят под стиль кода Python:

@percentage.setter
def percentage(self, percentage):
  if percentage < 0:
    self.__percentage = 0
  elif percentage >100:
    self.__percentage = 100
  else:
    self.__percentage = percentage

И вызовы будут выглядеть лаконичнее, красивее, без лишних «get_» / «set_».

Додам ще, що property може бути і без відповідного поля. Приклад:

class Thermometer():
  def __init__(self):
    self.__celsius = None

  @property
  def celsius(self):
    return self.__celsius

  @celsius.setter
  def celsius(self, value):
    self.__celsius = value

  @property
  def fahrenheit(self):
    return self.__celsius * 9 / 5 + 32

  @fahrenheit.setter
  def fahrenheit(self, value):
    self.__celsius = (value - 32) * 5 / 9

Вы из Китая пишите? Или Google отключили за долги по отоплению?

Я не можу знайти просте пояснення, в чому їх сакральне значення?

Подписаться на комментарии