Подтвердить что ты не робот

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

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

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

или

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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