Python get 和 set 方法与 @property 装饰器

Posted

技术标签:

【中文标题】Python get 和 set 方法与 @property 装饰器【英文标题】:Python get and set methods versus @property decorator 【发布时间】: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的封装 见this answer to a related question I wrote a while back “需要特定的语法和名称匹配才能工作。”它们实际上并没有,不过,如果你使用 @ 语法,它会,但这不是必需的。 @juanpa.arrivillaga 谢谢,您的答案的链接为我提供了我需要的所有信息。 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于Python get 和 set 方法与 @property 装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python 属性的 get 与 set 方法

Python入门-6面向对象编程:06私有属性和私有方法(实现封装)-@property装饰器-get和set方法-总结

Python中的get和set方法

Python私有属性set和get方法2

Python中的动态属性与描述符

Python私有属性set 和get方法