MorgoZ
MorgoZ

Reputation: 2052

Python property with public getter and private setter

I have a python property like this:

class Foo:

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

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

Currently, the value of maxInputs can be get and set by everyone.

However, I want to allow everyone to get the value of the maxInputs, but it should only be set inside of the Foo class.

So is there a way to declare a property with a private setter and a public getter?

Upvotes: 9

Views: 13160

Answers (2)

gman112358
gman112358

Reputation: 39

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

Upvotes: 1

Martijn Pieters
Martijn Pieters

Reputation: 1122312

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.

Upvotes: 9

Related Questions