Вы используете получение/установленный образец (в Python)?

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

Почему Вы используете или избегаете, добираются/методы установки в Python?

75
задан 4 revs, 2 users 60%Roger Pate 24 September 2014 в 21:29
поделиться

6 ответов

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

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

53
ответ дан 24 November 2019 в 11:29
поделиться

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

class MyClass:

    def __init__(self):
        self.my_attribute = 0  

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

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

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

Что важно, код клиента остается тем же.

108
ответ дан 24 November 2019 в 11:29
поделиться

Краткий ответ на ваш вопрос: нет, при необходимости вы должны использовать свойства. Райан Тамиоко дает подробный ответ в своей статье Геттеры / сеттеры / фуксоры

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

6
ответ дан 24 November 2019 в 11:29
поделиться

Вот что об этом говорит Гвидо ван Россум в Masterminds of Programming

Что вы имеете в виду под «борьбой с языком»?

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

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

27
ответ дан 24 November 2019 в 11:29
поделиться

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

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

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

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

5
ответ дан 24 November 2019 в 11:29
поделиться

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

14
ответ дан 24 November 2019 в 11:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: