Используете ли вы шаблон 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()