【问题标题】:Python properties best practice, a function inside a property [closed]Python属性最佳实践,属性内的函数[关闭]
【发布时间】:2013-09-13 01:04:10
【问题描述】:

拥有由非常基本的操作产生的属性是否是一种好习惯? 例如,假设我们有属性“a”和“b”,我们可以直接从“a”和“b”推断属性“c”。这被认为是糟糕的编码风格吗?

@property 
def c(self):
    return self.a + self.b

谢谢!

【问题讨论】:

  • 总的来说,这对我来说似乎没问题。但是,省略 def 不会。
  • 是的,你是对的,当然。添加了定义:-)

标签: python properties


【解决方案1】:

这取决于上下文。如果您有 start_timeend_time 属性并且想要 duration,则创建属性是有意义的。在其他情况下,它可能合适也可能不合适。但它不被认为是一种糟糕的编码风格。

【讨论】:

    【解决方案2】:

    使用属性的一个好处是,即使对于非常简单的计算,属性的有效值也会在ab 发生变化时自动更新。

    例如,如果c 不是属性,则每次self.aself.b 更改时,您都必须更新self.c 的值:

    self.a += 1
    self.c = self.a + self.b
    

    但如果c是一个属性,你可以简单地写

    self.a += 1
    self.c  # will already have the updated value
    

    【讨论】:

    • 诸如询问对象是否为空(假设通过其长度定义)之类的语句怎么样,即def is_empty(self): return len(self)==0 这里首选的方法是什么?作为函数还是作为属性?
    • 这是一个风格问题,但我会查看标准库以获取有关在此处做什么的指导。 Lists 没有 is_empty 方法(既没有函数也没有属性)。要测试list 是否为非空,只需编写if seq。如果定义了 __len__ 方法,您的类的行为方式将相同。您的班级似乎已经定义了__len__,因为您使用的是len(self)。所以我建议不要使用is_empty 函数或属性,而只使用if not self 而不是self.is_empty
    • @SmCaterpillar 这是一种品味,但两种方式都很好。重要的是你封装了一个功能。是函数还是属性,真的没那么多米。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多