<snip>
Basically, if you want to have a new attribute, say, myNewAttribute, instead of doing::
class SomeClass(...):
def __init__(self,...): ... self.myNewAttribute = something...
you do::
class SomeClass(...):
_myNewAttribute = None
def myNewAttribute(self):
if self._myNewAttribute is None: self._myNewAttribute = something
return self._myNewAttribute
Of course this means that you can only access it as 'self.myNewAttribute()' instead of 'self.myNewAttribute', because you never know when it will already be initialized. Actually, you can know when it is not initialized, because it will be None, but resist the temptation and let myNewAttribute() do it for you. That's what encapsulation is for.
You don't have to worry about updating old versions because, if the old instance doesn't have _myNewAttribute then it will be taken from the class. And the myNewAttribute() method will always be taken from the class anyway (even for old versions of your object).
Leo, thanks very much. That was just what I was after. much appreciated tim