I have written a class that will be used to store parameters in a convenient way for pickling. It overloads __setattr__ for convenient access. It also uses a list to remember the order in which attributes where added, so that the iteration order is predictable and constant. Here it is:
class Parameters(object):
def __init__(self):
self._paramOrder = []
def __setattr__(self, name, value):
self._paramOrder.append(name)
object.__setattr__(self, name, value)
def __delattr__(self, name):
self._paramOrder.remove(name)
object.__delattr__(self, name)
def __iter__(self):
for name in self._paramOrder:
yield self.name
def iteritems(self):
for name in self._paramOrder:
yield name, self.name
The problem is that __init__ calls my overloaded __setattr__ in order to add the _paramOrder to the instance dictionary. Is there a way to handle this without adding a special case to __setattr__?
yes.
have it call
super(Parameters, self).__setattr__()instead.Or am I missing something?
Another alternative is to just go straight to
__dict__This should work because you are not overriding
__getattr__so you can read it without anything getting in the way.