在Python中定义属性的首选方式:使用property装饰器还是lambda?
在Python中,定义类属性的最佳方式是什么?为什么呢?在一个类中同时使用这两种方式可以吗?
@property
def total(self):
return self.field_1 + self.field_2
或者
total = property(lambda self: self.field_1 + self.field_2)
3 个回答
5
不要用匿名函数来做这个。第一个可以用在只读属性上,第二个则是和真正的方法一起用,适合处理更复杂的情况。
51
对于只读属性,我会使用装饰器;如果不是只读的,我通常会这样做:
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
22
在你提到的这个例子中,使用装饰器的方式可能是最好的选择,因为你想把这个方法变成一个只读的属性。而在第二种情况下,如果你想提供一个设置器、删除器或者文档字符串,或者想添加一个与方法名称不同的属性来获取值,那么使用第二种方式会更好。