On Thu, Aug 18, 2011 at 7:44 PM, luvspython <srehtva...@gmail.com> wrote: > I'm using Python 2.7 and the code below fails at the 'super' statement > in the __setitem__ function in the HistoryKeeper class. The error is: > 'super' object has no attribute '_setitem__' > > Can anyone please tell me why and how to fix it? (I've googled > endlessly and I don't see the problem.) > > [The code will seem silly as it is, because it's pared down to show > the example. The goal is that multiple classes, like the Vehicle > class below, will inherit HistoryKeeper. History keeper overloads > __setitem__ and will eventually keep a running history every time an > attribute of any of the inheriting classes is changed.] > > Thanks in advance .... > > > class HistoryKeeper(object): > def __init__(self, args): > for arg, value in args.items(): > if arg != 'self': > self.__setitem__(arg, value) > > def __setitem__(self, item, value): > super(HistoryKeeper, self).__setitem__(item, value) > > > class Vehicle(HistoryKeeper): > def __init__(self, tag, make, model): > args = locals() > super(Vehicle, self).__init__(args) > > > if __name__ == "__main__": > car = Vehicle('TAG123', 'FORD', 'Model A') > print car.make
Did you mean to use __setattr__ instead? object, the base class of HistoryKeeper, does not have a __setitem__ method, hence the AttributeError. super() is a proxy for the next class in the MRO, typically the base class of your class. Keep in mind that <obj.tag = "TAG123"> is equivalent to <obj.__setattr__("tag", "TAG123")>. However, <obj["tag"] = "TAG123"> is equivalent to <obj.__setitem__("tag", "TAG123")>. see: http://docs.python.org/reference/datamodel.html#object.__setattr__ http://docs.python.org/reference/datamodel.html#object.__setitem__ http://docs.python.org/library/functions.html#super -eric > -- > http://mail.python.org/mailman/listinfo/python-list > -- http://mail.python.org/mailman/listinfo/python-list