Должен ли я использовать префиксы get /set в именах методов Python?


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

Но в тех случаях, когда свойство не подходит, все равно можно получить методы, которые ведут себя как геттеры или сеттеры. Теперь мои вопросы: должны ли эти имена методов начинаться с get_ / set_? Или это неэфтонная вебосность, поскольку часто очевидно, что имеется в виду (и все еще можно использовать строку docstring для уточнения неочевидного ситуации)?

Это может быть делом личного вкуса, но мне было бы интересно, что думает об этом большинство? Что бы вы предпочли как пользователь API? Пример: Предположим, у нас есть объект, представляющий несколько городов. Можно использовать метод get_city_by_postalcode(postalcode) или более короткое имя city_by_postalcode. Я склоняюсь к последнему.
5 12

5 ответов:

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

Вы никогда не потеряете шанс заставить ваше свойство вести себя как геттер/сеттер позже, используя дескрипторы . Если вы хотите изменить свойство только для чтения, вы также можете заменить его методом getter с тем же именем, что и свойство, и украсить его @property. Поэтому мой совет-избегать геттеров/сеттеров, если только проект, над которым вы работаете, уже не использует их, потому что вы всегда можете изменить свое мнение позже и сделать свойства доступными только для чтения, только для записи или без них. изменение интерфейса для вашего класса.

Если его можно использовать как свойство (одно значение, которое нужно получить или установить, и никаких других параметров, я обычно делаю:

class Foo(object):

    def _get_x(self):
        pass

    def _set_x(self, value):
        pass

    x = property(_get_x, _set_x)

Если геттер / сеттер немного сложнее, я бы использовал get_x и set_x:

Я видел, как это делается в обоих направлениях. Исходя из фона Objective-C, я обычно делаю foo()/set_foo(), если я не могу использовать свойство (хотя я стараюсь использовать свойства, когда это возможно). Это действительно не имеет значения, что многое, хотя, , Как долго, как вы последовательны.

(Конечно, в вашем примере я бы вообще не называл метод get_city_by_postalcode(); я бы, вероятно, пошел с translate_postalcode или чем-то подобным, что использует лучший глагол действия в названии.)

Если мне нужно использовать геттер / сеттер, мне нравится этот способ:

Предположим, что у вас есть переменная самость._x. Тогда X() будет возвращать значение собственной личности._x, и setX (x) установит значение self._x