Python属性(property)的公共getter和私有setter

9

我有一个像这样的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和公共getter的属性?

2个回答

9

Python没有隐私模型。下划线只是一种约定,没有访问控制。 如果您不想将“public” API 包括在sett中,则只需从类中删除setter,并直接在您的类代码中分配给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

在我有一个带有私有setter的公共属性的情况下,我使用两个属性。这确实会创建一些冗余代码,但最终我会遵循装饰器的约定。请参见以下示例:

@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

3
这会引发一个“RecursionError”,因为“_current_dir(self)”方法在调用自身(“self._current_dir”)。 - Ollie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接