Используете ли вы шаблон get/set (в Python)?

Использование get/set кажется распространенной практикой в ​​Java (по разным причинам), но я почти не вижу код Python, который использует это.

Почему вы используете или избегаете методов get/set в Python?

Ответ 1

Холодная ссылка: Python - это не Java:)

В Java вы должны использовать геттеры и сеттеры, потому что использование открытых полей не дает вам возможности вернуться назад и передумать позже, используя геттеры и сеттеры. Таким образом, на Java вы также можете избавиться от проблемы. В Python это глупо, потому что вы можете начать с нормального атрибута и изменить свое мнение в любое время, не затрагивая никаких клиентов класса. Итак, не пишите геттеры и сеттеры.

Ответ 2

В python вы можете просто получить доступ к атрибуту напрямую, потому что он общедоступен:

class MyClass(object):

    def __init__(self):
        self.my_attribute = 0  

my_object = MyClass()
my_object.my_attribute = 1 # etc.

Если вы хотите что-то сделать для доступа или мутации атрибута, вы можете использовать свойства:

class MyClass(object):

    def __init__(self):
        self._my_attribute = 0

    @property
    def my_attribute(self):
        # Do something if you want
        return self._my_attribute

    @my_attribute.setter
    def my_attribute(self, value):
        # Do something if you want
        self._my_attribute = value

Крайне важно, что код клиента остается прежним.

Ответ 3

Вот что говорит о Guido van Rossum об этом в Учредители программирования

Что вы подразумеваете под "борьбой с языком"?

Guido: Это обычно означает, что они пытаясь продолжить свои привычки, которые хорошо работал на другом языке.

[...] Люди превратят все в класс и превратить каждый доступ в метод доступа,
где это действительно не мудро, что делать в Python; у вас будет более подробный код, который находится на сложнее отлаживать и работать намного медленнее. Вы знаете выражение "Вы можете написать FORTRAN на любом языке?" Вы также можете писать Java на любом языке.

Ответ 4

Нет, это неряшливо. Общепринятым способом является использование обычного атрибута данных и замена тех, которые требуют более сложной логики get/set со свойствами.

Ответ 5

Ваше наблюдение верное. Это не обычный стиль программирования Python. Атрибуты являются общедоступными, поэтому вы просто получаете доступ (получать, устанавливать, удалять), как и с атрибутами любого объекта, который имеет их (а не только классы или экземпляры). Легко сказать, когда Java-программисты изучают Python, потому что их код на Python выглядит как Java, используя синтаксис Python!

Я определенно согласен со всеми предыдущими плакатами, особенно @Maximiliano, ссылкой на знаменитую статью Phillip и предложение @Max о том, что все более сложное, чем стандартный способ установки (и получения) атрибутов класса и экземпляра, заключается в использовании свойств (или дескрипторов для обобщения еще больше), чтобы настроить получение и настройку атрибутов! (Это включает в себя возможность добавлять собственные индивидуальные версии личной, защищенной, дружеской или любой другой политики, если вы хотите чего-то другого, кроме публичного.)

В качестве интересной демонстрации в "Программирование основного питона" (глава 13, раздел 13.16), я придумал пример использования дескрипторов для хранить атрибуты на диске, а не в памяти! Да, это нечетная форма постоянного хранения, но она показывает вам пример того, что возможно!

Вот еще одна статья, которую вы можете найти полезной: Python: несколько свойств, один сеттер/получатель

Ответ 6

Короткий ответ на ваш вопрос - нет, вы должны использовать свойства, когда это необходимо. Ryan Tamyoko дает длинный ответ в своей статье Getters/Setters/Fuxors

Основное значение, которое нужно убрать из всего этого, заключается в том, что вы хотите стремиться к тому, чтобы каждая отдельная строка кода имела какое-то значение или значение для программиста. Языки программирования предназначены для людей, а не для машин. Если у вас есть код, который выглядит так, как будто он ничего не делает, он трудно читать или кажется утомительным, тогда есть хорошие шансы, что у Python есть функция языка, которая позволит вам удалить его.

Ответ 7

Наш учитель показал один пример в классе, объясняющий, когда мы должны использовать функции доступа.

class Woman(Human):
    def getAge(self):
        if self.age > 30:
            return super().getAge() - 10
        else:
            return super().getAge()