Вы используете шаблон get / set (в Python)? - PullRequest
72 голосов
/ 05 апреля 2010

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

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

Ответы [ 8 ]

106 голосов
/ 05 апреля 2010

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

class MyClass:

    def __init__(self):
        self.my_attribute = 0  

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

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

class MyClass:

    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

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

52 голосов
/ 05 апреля 2010

Классная ссылка: Python не является Java :)

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

26 голосов
/ 05 апреля 2010

Вот что Гвидо ван Россум говорит об этом в Мастер программирования

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

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

[...] Люди превратят все в класс и превратить каждый доступ в метод доступа,
где это не очень разумно делать в Python; у вас будет более подробный код, который будет
сложнее отлаживать и работает намного медленнее. Вы знаете выражение «Вы можете написать ФОРТРАН на каком-нибудь языке? »Вы также можете писать на любом языке на Java.

13 голосов
/ 05 апреля 2010

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

6 голосов
/ 05 апреля 2010

Короткий ответ на ваш вопрос - нет, вы должны использовать свойства, когда это необходимо. Райан Тамёко дает длинный ответ в своей статье Геттеры / Сеттеры / Фуксоры

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

5 голосов
/ 05 апреля 2010

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

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

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

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

0 голосов
/ 13 марта 2019

Я пришел сюда за этим ответом (к сожалению, я не смог). Но я нашел работу вокруг еще где. Этот код может быть альтернативой для get .
class get_var_lis: def __init__(self): pass def __call__(self): return [2,3,4] def __iter__(self): return iter([2,3,4]) some_other_var = get_var_lis
Это просто обходной путь . Используя вышеупомянутую концепцию, вы можете легко построить метод get / set в py.

0 голосов
/ 05 мая 2015

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

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