properties (or any other descriptor) are for computed attributes, that is members that have the semantic of an attribute but needs some computation either on set and/or get. By 'semantic of an attribute', I mean it makes sense, from the client's code, to write:
something = obj.attribute
and / or
obj.attribute = something_else
As soon as you have to pass arguments to a getter or more than one argument to the setter, it doesn't have an attribute
semantic, obviously, so you cannot use a computed attribute. The solution is simple: use an explicit getter/setter pair.
The point about getters/setters not being needed in Python is that for anything that has attribute's semantic (but not anything else) you can always turn a direct attribute access to a computed one if and when you need it without breaking the client code. That's not your case here obviously.
tl;dr: abusing properties the way you do is not pythonic and you'd be better with explicit getter and setter.