在Python中定义类属性的首选方法是什么?为什么?在一个班级中同时使用两者都可以吗?
@property
def total(self):
return self.field_1 + self.field_2
或
total = property(lambda self: self.field_1 + self.field_2)
答案 0 :(得分:50)
对于只读属性,我使用装饰器,否则我通常会这样做:
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
答案 1 :(得分:21)
在您显示的情况下,装饰器表单可能是最佳的,您希望将该方法转换为只读属性。如果要提供setter / deleter / docstring以及getter,或者如果要为其派生其值的方法添加具有不同名称的属性,则第二种情况更好。
答案 2 :(得分:4)
不要使用lambdas。第一种是只读属性是可接受的,第二种是使用真实方法来处理更复杂的情况。