One of my projects this summer has been to learn Python. I want to be able to use it to replace Matlab and LabView. I may try to write a little more of the how and why later. I have been learning a great deal about Python in the last month or so and thought maybe I would try posting solutions to the little frustrations I find in hopes that it may save someone else the frustration.
So here is #1: property()
This is a cool feature of Python, that the typical getter/setter patterns in C++ classes can be implemented easily and quickly. But here is the problem:
class C:
def __init__(self) : self.__x = 0
def getx(self):
print "(Fetch)",
return self.__x
def set_trace(self, value):
self.__x = value
x = property(getx, set_trace)
foo = C()
print “foo.x = “, foo.x
foo.x = 1
print “foo.x = “, foo.x
foo.x = 3
print “foo.x = “, foo.x
>>foo.x = (Fetch) 0
>>foo.x = 1
>>foo.x = 3
This doesn’t work, getx() is only called the first time. After that, the foo.x = 1 assignment overwrites the getter/setter object. Perhaps the solution is obvious to Python guru’s but it wasn’t to me. However, I finally discovered that for properties to work C must explicitly inheret from the object class. Simply change the first line to:
class C(object):
and wala! You get:
>>foo.x = (Fetch) 0
>>foo.x = (Fetch) 1
>>foo.x = (Fetch) 3
Hope that helps!