Search code examples
pythonpropertieslanguage-features

Python: How to pass more than one argument to the property getter?


Consider the following example:

class A:
    @property
    def x(self): return 5

So, of course calling the a = A(); a.x will return 5

But imagine that you want to be able to modify the property x.
This way, for example:

class A:
    @property
    def x(self, neg = False): return 5 if not neg else -5

And call it with a = A(); a.x(neg=True)

That will raise a TypeError: 'int' object is not callable, that is quite normal, since our x is evaluated as 5.

So, I would like to know how one can pass more then one argument to the property getter, if it is possible at all.


Solution

  • Note that you don't have to use property as a decorator. You can quite happily use it the old way and expose the individual methods in addition to the property:

    class A:
        def get_x(self, neg=False):
            return -5 if neg else 5
        x = property(get_x)
    
    >>> a = A()
    >>> a.x
    5
    >>> a.get_x()
    5
    >>> a.get_x(True)
    -5
    

    This may or may not be a good idea depending on exactly what you're doing with it (but I'd expect to see an excellent justification in a comment if I came across this pattern in any code I was reviewing)