【问题标题】:Python get and set methods versus @property decoratorPython get 和 set 方法与 @property 装饰器
【发布时间】:2022-01-18 02:25:45
【问题描述】:

我正在探索 Python 中的装饰器,作为一个从其他语言来到 Python 的人,我对 @property 及其 @xxx.setter 兄弟的目的有点困惑。在 Java 和 C++ 中,get_xxx()set_xxx() 通常是组织封装的方式。在 Python 中,我们有这两个装饰器,它们需要特定的语法和名称匹配才能工作。 @propertyget-set 方法好多少?

我检查了this post,但除了+= 运算符的可用性之外,@property 的优势是什么?

【问题讨论】:

  • 重点是您不应该在 Python 中编写 getter 和 setter。这是理解的关键。只需使用普通的self.x = whatever
  • 使用property优势是您不必编写样板的getter 和setter。您只需使用普通属性,如果和何时您需要控制对属性的访问,只有在您才添加属性,并且不会破坏客户端的界面到您的班级或您自己的实现。所以你得到没有样板的getter和setter的封装
  • “需要特定的语法和名称匹配才能工作。”它们实际上并没有,不过,如果你使用 @ 语法,它会,但这不是必需的。
  • @juanpa.arrivillaga 谢谢,您的答案的链接为我提供了我需要的所有信息。

标签: python properties python-decorators getter-setter


【解决方案1】:

property 用于属性的最佳之处在于您不需要它

Python 的理念是类的属性和方法都是公共的,但按照惯例 - 当您在它们的名称前加上一个“_”时

“属性”的机制,即描述符协议,允许人们将以前的愚蠢的普通属性更改为检测属性,如果系统发展到需要它的情况,则使用 getter 和 setter 的代码进行保护。

但默认情况下,类中的name 属性只是一个普通属性。你做person.name = "Name"-不需要保护,不需要设置方法,也不推荐。如果需要对此进行保护(例如,将名称大写或过滤不正确的单词),则使用该属性的任何代码都不需要更改:使用属性,属性分配仍然通过“=”进行运算符。

除此之外,如果对你来说使用“=”看起来并不比 person.set_name("Name") 漂亮,我认为它对大多数人来说都是如此。当然,这是主观的。

【讨论】:

    猜你喜欢
    • 2018-03-29
    • 2021-11-27
    • 2013-01-19
    • 2010-10-16
    • 1970-01-01
    • 2014-07-09
    • 2018-04-04
    • 2016-04-02
    • 2016-03-14
    相关资源
    最近更新 更多