繁体   English   中英

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

[英]Python property with public getter and private 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 和一个公共的 getter 来声明一个属性呢?

Python 没有隐私模型 使用下划线只是一种惯例,没有访问控制。 如果您不希望“公共”API包含设置,那么只需从您的类中删除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 然而,这并没有提供太多的语法改进。

在我有一个带有私有 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM