【问题标题】:Why using getters/setters in python为什么在 python 中使用 getter/setter
【发布时间】:2014-02-23 15:12:19
【问题描述】:

我偶然发现了以下在另一个问题中使用 getter 和 setter 的示例 Preferred way of defining properties in Python: property decorator or lambda?

由于 python 有隐式的 getter 和 setter,我想知道为什么要像下面这样显式地定义它们。这些示例有什么优势,还是只有当 getter/setter 涉及比下面的简化示例更复杂的事情时才有意义?

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

【问题讨论】:

  • “因为 python 有隐式的 getter 和 setter”。你能扩展一下吗?你是说如果你不使用property,python 无论如何都会使sneaky 成为一个属性?如果是这样,那不是真的。
  • 通常情况下,人们放置 getter 或 setter 的唯一原因是在修改属性时在后台执行其他操作(例如设置标志或检查输入)。

标签: python


【解决方案1】:

通常你应该只使用属性访问。如果 getter 和 setter 只是增加开销,那么它们将毫无意义

Python 将 getter 和 setter 与属性联系起来的好处在于,您可以轻松地将属性更改为属性,而无需重构所有使用该类的代码。

【讨论】:

    【解决方案2】:

    您已经回答了有关语法差异的问题。您的第二个 sn-p 在以前的版本中是不可能的,因此是第一个示例。

    在 Python 中,在这个问题上为普通的 get/set 组合定义属性并没有太多的附加值(在编译语言中,例如 C#,从字段更改为属性,这更令人担忧将需要重新编译所有客户端代码,而在 C# 中更改属性的实现不一定需要重新编译)。通常,其中一种或两种方法通常会包含一些逻辑(可能是验证、延迟初始化)。

    有时您可能希望将属性设为只读,因此您可以这样做:

    @property
    def foo(self):
        return self.__foo
    

    虽然不是严格只读的,但它需要您自己处理 python 名称修改。

    【讨论】:

      猜你喜欢
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2011-09-06
      • 2018-07-15
      相关资源
      最近更新 更多