Про mutator method
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
Чи можете на пальцях пояснити про mutator method, setters, getters на прикладі Python? В чому їх смисл і коли їх використовувати?
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
Чи можете на пальцях пояснити про mutator method, setters, getters на прикладі Python? В чому їх смисл і коли їх використовувати?
Я в 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
10 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів