Fun with python properties
I ran into an oddity of something I wanted to do with python properties while playing with my music server the yesterday. After a little futzing, I found a way around my problem. Read on to find out how to do python properties and inheritance.
Assume we have two classes. The first, Base
, provides property-style access to some attributes. Straightforward get and set. The Derived
class wants the same thing, but wants to change the default “unset” value for property foo
.
In the absence of property (dot-style) access, it would just be a matter of overriding getFoo()
. To make property access work right, we must get a little bit clever.
At first it seems simple. Just point the arguments to property()
to the get and set functions and be done with this. Seems obvious:
class Base(object):
def __init__(self):
self.foo = None
def getFoo(self):
return self.__foo
def setFoo(self, val):
self.__foo = val
# Seemingly obvious solution:
# foo = property(fget=getFoo, fset=setFoo)
#
# Actual solution:
foo = property(fget=lambda self: self.getFoo(),
fset=lambda self, v: self.setFoo(v)
)
class Derived(Base):
def getFoo(self):
"""Same as in Base, but default to 0 instead of None."""
result = super(Derived, self).getFoo()
if result != None:
return result
else:
return 0
if __name__ == "__main__":
t1 = Base()
print t1.foo
t1.foo = "Something"
print t1.foo
print
t2 = Derived()
print t2.foo
t2.foo = "bar"
print t2.foo
I was pretty impressed with myself for figuring this out. So I’m putting it on my site to pat myself on the back. Turns out, after my initial bitching, that python is actually pretty cool.