Который является предпочтительным способом определить свойства класса в Python и почему? Это в порядке для использования обоих в одном классе?
@property
def total(self):
return self.field_1 + self.field_2
или
total = property(lambda self: self.field_1 + self.field_2)
Форма декоратора, вероятно, лучше всего подходит в том случае, когда вы хотите превратить метод в свойство только для чтения. Второй случай лучше, когда вы хотите предоставить setter/deleter/docstring, а также getter или если вы хотите добавить свойство, которое имеет другое имя к методу, из которого оно получает свое значение.
Для свойств только для чтения я использую декоратор, иначе я обычно делаю что-то вроде этого:
class Bla(object):
def sneaky():
def fget(self):
return self._sneaky
def fset(self, value):
self._sneaky = value
return locals()
sneaky = property(**sneaky())
update:
Последние версии python улучшили подход декоратора:
class Bla(object):
@property
def elegant(self):
return self._elegant
@elegant.setter
def elegant(self, value):
self._elegant = value
Не используйте лямбды для этого. Первый приемлем для свойства только для чтения, второй используется с реальными методами для более сложных случаев.