为什么在python中使用getter / setter

时间:2014-01-31 02:17:30

标签: python

我偶然发现了下面在另一个问题中使用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

2 个答案:

答案 0 :(得分:2)

通常您应该使用属性访问权限。如果他们只是增加开销

,那么getter和setter就毫无意义

Python将getter和setter绑定到属​​性的方式很好,就是你可以轻松地将属性更改为属性,而无需去重构所有使用该类的代码。

答案 1 :(得分:1)

您已经回答了自己关于语法差异的问题。你的第二个片段在以前的版本中是不可能的,因此是第一个例子。

在Python中,没有太多的增值来为vanilla get / set组合在这个问题上定义一个属性(在编译语言中更像是一个问题,比如C#,从字段变为属性将需要重新编译所有客户端代码,而在C#中对属性的实现的更改不一定需要重新编译)。通常,一个或两个方法通常都包含一些逻辑(验证,懒惰初始化)。

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

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

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