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 中,我们有这两个装饰器,它们需要特定的语法和名称匹配才能工作。 @property
比 get-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入门-6面向对象编程:06私有属性和私有方法(实现封装)-@property装饰器-get和set方法-总结