Предпочтительный способ определения свойств в Python: декоратор свойств или лямбда?

Какой способ определения свойств класса в Python предпочтительнее и почему? Можно ли использовать оба в одном классе?

@property
def total(self):
    return self.field_1 + self.field_2

or

total = property(lambda self: self.field_1 + self.field_2)

person parxier    schedule 09.03.2010    source источник
comment
Где вы видели это свойство через лямбда, которое заставило бы вас думать, что его можно было бы предпочесть? Вы много таких видели? Если да, то где?   -  person S.Lott    schedule 09.03.2010
comment
@ S.Lott Какая-то книга по питону, не помню. Теперь я буду использовать декораторы. Без проблем. :-)   -  person parxier    schedule 10.03.2010


Ответы (3)


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

person Benno    schedule 09.03.2010
comment
С.Лотт - почему бы и нет? (не спорю - просто интересно) - person Yarin; 20.11.2011
comment
@S.Lott: хорошо, но каков ваш обходной путь к ограничению лямбда-выражений, не позволяющему использовать строки документации? - person smci; 06.08.2014

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

class Bla(object):
    def sneaky():
        def fget(self):
            return self._sneaky
        def fset(self, value):
            self._sneaky = value
        return locals()
    sneaky = property(**sneaky())

обновление:

Последние версии python улучшили подход декоратора:

class Bla(object):
    @property
    def elegant(self):
        return self._elegant

    @elegant.setter
    def elegant(self, value):
        self._elegant = value
person Toni Ruža    schedule 09.03.2010
comment
Я получаю ошибки при использовании flake8, pyflakes при использовании этой нотации. Я получаю переопределение функции «элегантные» предупреждения. - person Stephan; 24.09.2012
comment
С Pylint есть дополнительное преимущество использования декоратора. См. предупреждение Pylint W0212 со свойствами, обращающимися к защищенный член: как избежать?. Это сохраняет способность Pylint проверять возвращаемое значение/объект. - person Hibou57; 19.07.2014

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

person Ignacio Vazquez-Abrams    schedule 09.03.2010