在Python中定义属性的首选方法:属性装饰器还是lambda?

时间:2010-03-09 04:00:43

标签: python lambda properties decorator

在Python中定义类属性的首选方法是什么?为什么?在一个班级中同时使用两者都可以吗?

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

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

3 个答案:

答案 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。第一种是只读属性是可接受的,第二种是使用真实方法来处理更复杂的情况。