2

I have a class with property decorator.

class Dispatcher:
    def __init__(self, url):
        self._session = None

    @property
    def session(self):
        return self._session

    @session.setter
    def session(self, value):
        self._session = value

But I don't need the getter, can I have property with only the setter?

It's most more a curiosity.

Rodrigo
  • 135
  • 4
  • 45
  • 107
  • 1
    First answer seems useful: https://stackoverflow.com/questions/17576009/python-class-property-use-setter-but-evade-getter – joostblack Feb 26 '21 at 15:17
  • 2
    Does this answer your question? [Python class @property: use setter but evade getter?](https://stackoverflow.com/questions/17576009/python-class-property-use-setter-but-evade-getter) – dtanabe Feb 26 '21 at 15:19

2 Answers2

5

The simplest way IMHO is

class Dispatcher:
    def __init__(self, url):
        self._session = None

    def _set_session(self, value):
        self._session = value

    session = property(fset=_set_session)

Demo:

>>> d = Dispatcher('a')
>>> d.session = 1
>>> d._session
1
>>> d.session
Traceback (most recent call last):
  File "<pyshell#81>", line 1, in <module>
    d.session
AttributeError: unreadable attribute
Serge Ballesta
  • 143,923
  • 11
  • 122
  • 252
3

You could make your own "setterOnly" decorator:

# decorator
def setterOnly(f):
    return property(None,f)

usage:

class P:

    @setterOnly
    def x(self,v): print("setting x to:",v)


p = P()
p.x = 3

setting x to: 3

For your class:

class Dispatcher:
    def __init__(self, url):
        self._session = None

    @setterOnly
    def session(self,value):
        self._session = value
Alain T.
  • 40,517
  • 4
  • 31
  • 51