【问题标题】:Preferred way of defining properties in Python: property decorator or lambda?在 Python 中定义属性的首选方式:属性装饰器还是 lambda?
【发布时间】:2011-01-25 06:45:00
【问题描述】:

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

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

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

【问题讨论】:

  • 你在哪里见过这个“通过 lambda 的属性”,这会让你认为它可能是“首选”?你见过很多这样的吗?如果有,在哪里?
  • @S.Lott 一些python书,我不记得了。从现在开始我将使用装饰器。没问题。 :-)

标签: python lambda properties decorator


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

装饰器形式可能最适合您所展示的情况,您希望将方法转换为只读属性。如果您想提供 setter/deleter/docstring 以及 getter,或者如果您想将具有不同名称的属性添加到从中派生其值的方法,则第二种情况会更好。

【讨论】:

  • S.Lott - 为什么不呢? (不争论——只是好奇)
  • @S.Lott:好的,但是你有什么办法解决 lambdas 的限制,但不允许文档字符串?
【解决方案3】:

不要为此使用 lambda。第一个对于只读属性是可以接受的,第二个用于更复杂情况的真实方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-02
    • 2014-06-25
    • 1970-01-01
    • 2018-07-06
    • 2013-04-10
    • 2018-01-31
    • 2018-07-20
    • 2012-07-15
    相关资源
    最近更新 更多