2013-05-25 3 views
0

Я знаю о свойствах в python и о том, как они позволяют использовать атрибут классов так же, как и раньше, но с некоторой возможной модификацией между ними.Свойства Python vs Комбинированный метод Set/Get

Во всяком случае, проделав некоторые Perl недавно я полюбил идею иметь даже меньше кода и с геттер и сеттер комбинированных

как:

sub filename { 
    my $self  = shift; 
    my $filename = shift; 
    if ($filename){ $self->$filename = $filename;} 
    else {return $self->$filename;} 
} 

Очевидно, что в Perl можно опустить() позади метода, который делает этот подход «более чистым» и более прозрачным для пользователей моего класса.

В пй я мог бы сделать подобный единственный недостаток заключается в необходимости для() при обращении:

def filename(self, setter=None): 
    if setter is not None: 
     self._filename = setter 
    else: 
     return self._filename 

Для меня это просто способ более компактно, то делает свойство вещи, и я полагаю, что мой код более читаемым ,

Так или нет, что-то не так с моим подходом или по какой-то причине это унииоматично?

Спасибо!

ответ

2

Первая проблема заключается в том, что интерфейс отличается и, возможно, менее ясен. unit.position = new_pos превращен в unit.position(new_pos). Это принятое правописание для мутации на некоторых языках, но не так много в Python. Вряд ли кто-либо делает это: даже если property не используется, обычно используются отдельные методы get и set. Другими словами, ваш код будет выделяться как неидиоматический и запутанный.

Следствием этого является то, что расширенные операторы присваивания больше не работают: unit.position += velocity невозможен (он работает, если .position - это свойство). Другая потенциальная проблема заключается в том, что это не поддерживает установку свойства None. Вы должны придумать свое собственное дозорное значение (NO_VALUE = object() и т. Д.), Что сделало бы все испытание более уродливым.

Предполагаемая выгода на стороне реализации довольно мала: при сохранении пустой строки или двух вам потребуются дополнительные отступы и условия. Обратите внимание, что свойства делают больше, чем просто установка или возврат (иначе это не должно быть свойство). Свойства (8 линий)

@property 
def width(self, new_width): 
    self._width = new_width 
    self._dirty = True 

@width.setter 
def width(self): 
    return self._width 

против геттерного-сеттер-метода (6 строк):

def width(self, new_width=None): 
    if new_width is not None: 
     self._width = new_width 
     self._dirty = True 
    else: 
     return self._width 

Вы экономите одну пустую строку и один не пустая строка, но для этого вы платите с

  • хуже интерфейс
  • более отступы
  • больше потенциальных ошибок (например, опечатка в состоянии , забыли else)
+0

delnan, я получаю вашу точку зрения, и вы в порядке. Я вижу проблему с идентификацией. Я лично считаю, что иметь больше методов = больше линии = больше раздуваться и менее кратким. И когда у вас есть класс с 10 свойствами, мне становится сложнее сохранить обзор. Но, возможно, это только я. :-) Спасибо за ваше мнение! – AlessandroEmm

+0

Признание @delnan тоже мое (+1).Части python сочетаются во многих крутых путях. Если вы изобретаете свои собственные «части» или идиомы, вы теряете будущие функциональные возможности (например, сортировка итерирующих или увеличивающихся свойств) –

+0

@PhilCooper Вы правы, и я хорошо знаю, что я бы пошел унииоматическим способом, мне просто интересно что люди думают об этих подходах. Насколько я знаю, не слишком много жалоб на perl/scala, насколько я вижу. – AlessandroEmm

Смежные вопросы