具有公共getter和私有setter的Python属性

时间:2017-02-09 12:50:23

标签: python properties getter-setter

我有一个像这样的python属性:

class Foo:

    @property
    def maxInputs(self):
        return self._persistentMaxInputs.value

    @maxInputs.setter
    def maxInputs(self, value):
        self._persistentMaxInputs.value = value

目前,每个人都可以获取并设置maxInputs的值。

但是,我希望每个人都能获得maxInputs的值,但只能在Foo类中设置。

那么有没有办法用私有的setter和public getter声明一个属性?

2 个答案:

答案 0 :(得分:4)

Python 没有隐私模型。使用下划线只是一种惯例,没有访问控制。 如果您不希望“公开”API包含设置,那么只需从您的班级中删除设置器,然后直接在您的班级代码中分配给self._persistentMaxInputs.value。如果要限制需要记住此位置的位置数量,可以使其成为函数:

def _setMaxInputs(self, value):
    self._persistentMaxInputs.value = value

当然可以将它作为一个单独的property对象,但是你必须放弃装饰器语法:

def _maxInputs(self, value):
    self._persistentMaxInputs.value = value
_maxInputs = property(None, _maxInputs)

但现在至少可以在类代码中使用self._maxInputs = value。然而,这并没有提供那么多的语法改进。

答案 1 :(得分:1)

如果我拥有带有私有设置员的公共财产,我会使用两个属性。它确实创建了一些冗余代码,但最终我还是遵循了带有装饰器的约定。请参见下面的示例:

@property
def current_dir(self) -> str:
    """
    Gets current directory, analogous to `pwd`
    :return: Current working directory
    """
    return self._current_dir

@property
def _current_dir(self) -> None:
    return self._current_dir

@_current_dir.setter
def _current_dir(self, path:str) -> None:
    self._current_dir = path