在Python中定义属性的首选方式:使用property装饰器还是lambda?

36 投票
3 回答
25998 浏览
提问于 2025-04-15 20:11

在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

在你提到的这个例子中,使用装饰器的方式可能是最好的选择,因为你想把这个方法变成一个只读的属性。而在第二种情况下,如果你想提供一个设置器、删除器或者文档字符串,或者想添加一个与方法名称不同的属性来获取值,那么使用第二种方式会更好。

撰写回答