["python","inheritance","properties","overriding"]
Overriding properties in python

So, I'm trying to figure out the best (most elegant with the least amount of code) way to allow overriding specific functions of a property (e.g., just the getter, just the setter, etc.) in python. I'm a fan of the following way of doing properties, due to the fact that all of their methods are encapsulated in the same indented block of code (it's easier to see where the functions dealing with one property stop and the functions dealing with the next begin): @apply def foo(): """A foobar""" def fget(self): return self._foo def fset(self, val): self._foo = val return property(**locals()) However, if I want to inherit from a class that defines properties in this manner, and then, say, override the foo setter function, it seems tricky. I've done some searching and most of the answers I've found have been to define separate functions in the base class (e.g. getFoo and setFoo), explicitly create a property definition from them (e.g. foo = property(lambda x: x.getFoo(), lambda x, y: x.setFoo(y), lambda x: x.delFoo())), and then override getFoo, setFoo, and delFoo as needed. I dislike this solution because it means I have to define lambas for every single property, and then write out each function call (when before I could have just done property(**locals())). I also don't get the encapsulation that I had originally. Ideally, what I would like to be able to do would be something like this: class A(object): def __init__(self): self.foo = 8 @apply def foo(): """A foobar""" def fget(self): return self._foo def fset(self, val): self._foo = val return property(**locals()) class ATimesTwo(A): @some_decorator def foo(): def fset(self, val): self._foo = val * 2 return something And then the output would look something like: >>> a = A() >>> a.foo 8 >>> b = ATimesTwo() >>> b.foo 16 Basically, ATimesTwo inherits the getter function from A but overrides the setter function. Does anybody know of a way to do this (in a manner that looks similar to the example above)? What function would the some_decorator look like, and what should the foo function return?
I'm sure you've heard this before, but apply has been deprecated for eight years, since Python 2.3. Don't use it. Your use of locals() is also contrary to the Zen of Python -- explicit is better than implicit. If you really like the increased indentation, there is no need to create a throwaway object, just do if True: @property def foo(self): return self._foo @foo.setter def foo(self, val): self._foo = val Which doesn't abuse locals, use apply, require creation of an extra object, or need a line afterwards with foo = foo() making it harder to see the end of the block. It works just as well for your old-fashioned way of using property -- just do foo = property(fget, fset) as normal. If you want to override a property in an arbitrary subclass, you can use a recipe like this. If the subclass knows where the property was defined, just do: class ATimesTwo(A): @A.foo.setter def foo(self, val): self._foo = val * 2