Предпочитаемый способ определения свойств в Python: декоратор свойств или лямбда? - PullRequest
33 голосов
/ 09 марта 2010

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

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

или

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

Ответы [ 3 ]

50 голосов
/ 09 марта 2010

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

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
21 голосов
/ 09 марта 2010

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

4 голосов
/ 09 марта 2010

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

...