Python property with public getter and private setter

后端 未结 2 1316
清歌不尽
清歌不尽 2021-02-09 13:52

I have a python property like this:

class Foo:

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

    @maxInputs.setter
             


        
相关标签:
2条回答
  • 2021-02-09 14:10

    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.

    0 讨论(0)
  • 2021-02-09 14:28

    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
    
    0 讨论(0)
提交回复
热议问题