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

par*_*ier 35 python lambda properties decorator

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

@property
def total(self):
    return self.field_1 + self.field_2
Run Code Online (Sandbox Code Playgroud)

要么

total = property(lambda self: self.field_1 + self.field_2)
Run Code Online (Sandbox Code Playgroud)

Ton*_*uža 51

对于只读属性,我使用装饰器,否则我通常会这样做:

class Bla(object):
    def sneaky():
        def fget(self):
            return self._sneaky
        def fset(self, value):
            self._sneaky = value
        return locals()
    sneaky = property(**sneaky())
Run Code Online (Sandbox Code Playgroud)

更新:

最新版本的python增强了装饰器方法:

class Bla(object):
    @property
    def elegant(self):
        return self._elegant

    @elegant.setter
    def elegant(self, value):
        self._elegant = value
Run Code Online (Sandbox Code Playgroud)

  • 使用flake8时,我会遇到错误,使用这种表示法时会出现pyflakes.我重新定义了功能'优雅'的警告. (2认同)

Ben*_*nno 22

在您显示的情况下,装饰器形式可能是最佳的,您希望将该方法转换为只读属性.如果要提供setter/deleter/docstring以及getter,或者如果要为其派生其值的方法添加具有不同名称的属性,则第二种情况更好.

  • S.Lott - 为什么不呢?(不是在争论 - 只是好奇) (29认同)

Ign*_*ams 5

请勿为此使用lambda。第一个参数对于只读属性是可接受的,第二个参数与实际方法一起用于更复杂的情况。