Использование get/set кажется распространенной практикой в Java (по разным причинам), но я почти не вижу код Python, который использует это.
Почему вы используете или избегаете методов get/set в Python?
Использование get/set кажется распространенной практикой в Java (по разным причинам), но я почти не вижу код Python, который использует это.
Почему вы используете или избегаете методов get/set в Python?
Холодная ссылка: Python - это не Java:)
В Java вы должны использовать геттеры и сеттеры, потому что использование открытых полей не дает вам возможности вернуться назад и передумать позже, используя геттеры и сеттеры. Таким образом, на Java вы также можете избавиться от проблемы. В Python это глупо, потому что вы можете начать с нормального атрибута и изменить свое мнение в любое время, не затрагивая никаких клиентов класса. Итак, не пишите геттеры и сеттеры.
В 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
Крайне важно, что код клиента остается прежним.
Вот что говорит о Guido van Rossum об этом в Учредители программирования
Что вы подразумеваете под "борьбой с языком"?
Guido: Это обычно означает, что они пытаясь продолжить свои привычки, которые хорошо работал на другом языке.
[...] Люди превратят все в класс и превратить каждый доступ в метод доступа,
где это действительно не мудро, что делать в Python; у вас будет более подробный код, который находится на сложнее отлаживать и работать намного медленнее. Вы знаете выражение "Вы можете написать FORTRAN на любом языке?" Вы также можете писать Java на любом языке.
Нет, это неряшливо. Общепринятым способом является использование обычного атрибута данных и замена тех, которые требуют более сложной логики get/set со свойствами.
Ваше наблюдение верное. Это не обычный стиль программирования Python. Атрибуты являются общедоступными, поэтому вы просто получаете доступ (получать, устанавливать, удалять), как и с атрибутами любого объекта, который имеет их (а не только классы или экземпляры). Легко сказать, когда Java-программисты изучают Python, потому что их код на Python выглядит как Java, используя синтаксис Python!
Я определенно согласен со всеми предыдущими плакатами, особенно @Maximiliano, ссылкой на знаменитую статью Phillip и предложение @Max о том, что все более сложное, чем стандартный способ установки (и получения) атрибутов класса и экземпляра, заключается в использовании свойств (или дескрипторов для обобщения еще больше), чтобы настроить получение и настройку атрибутов! (Это включает в себя возможность добавлять собственные индивидуальные версии личной, защищенной, дружеской или любой другой политики, если вы хотите чего-то другого, кроме публичного.)
В качестве интересной демонстрации в "Программирование основного питона" (глава 13, раздел 13.16), я придумал пример использования дескрипторов для хранить атрибуты на диске, а не в памяти! Да, это нечетная форма постоянного хранения, но она показывает вам пример того, что возможно!
Вот еще одна статья, которую вы можете найти полезной: Python: несколько свойств, один сеттер/получатель
Короткий ответ на ваш вопрос - нет, вы должны использовать свойства, когда это необходимо. Ryan Tamyoko дает длинный ответ в своей статье Getters/Setters/Fuxors
Основное значение, которое нужно убрать из всего этого, заключается в том, что вы хотите стремиться к тому, чтобы каждая отдельная строка кода имела какое-то значение или значение для программиста. Языки программирования предназначены для людей, а не для машин. Если у вас есть код, который выглядит так, как будто он ничего не делает, он трудно читать или кажется утомительным, тогда есть хорошие шансы, что у Python есть функция языка, которая позволит вам удалить его.
Наш учитель показал один пример в классе, объясняющий, когда мы должны использовать функции доступа.
class Woman(Human):
def getAge(self):
if self.age > 30:
return super().getAge() - 10
else:
return super().getAge()