'super' object has no attribute '__setitem__'

Eric Snow ericsnowcurrently at gmail.com
Thu Aug 18 22:07:12 EDT 2011

On Thu, Aug 18, 2011 at 7:44 PM, luvspython <srehtvandy at 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")>.




> --
> http://mail.python.org/mailman/listinfo/python-list

More information about the Python-list mailing list