Python property with public getter and private setter

孤人 提交于 2019-12-06 04:55:26

Python has no privacy model. Using underscores is only a convention, there is no access control. If you don't want the 'public' API to include a sett, then just remove the setter from your class and assign to self._persistentMaxInputs.value in your class code directly. You can make it a function if you want to limit the number of locations that need to remember this:

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

You can of course make that a separate property object, but then you'd have to forgo the decorator syntax:

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

but now at least you can use self._maxInputs = value in your class code. This doesn't really offer that much of a syntax improvement however.

I use two properties in a case where I have a public property with private setter. It does create some redundant code, but I end up following the convention with decorators. See example below:

@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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!