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



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



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

757   7  

7 ответов:

классная ссылка: 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

принципиально, клиентский код остается прежним.

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

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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.