'super' object has no attribute '__setitem__'

Bob Vandy srehtvandy at gmail.com
Fri Aug 19 15:37:08 EDT 2011


I'm pretty sure I'd actually read the first 2 links you point to, but the
difference between __setattr__ and __setitem__ still never registered with
me -- perhaps partly because even the discussion of __setattr__ discusses
adding an entry to the  "*dictionary* of instance attributes".

*MANY* thanks for your help!






On Thu, Aug 18, 2011 at 10:07 PM, Eric Snow <ericsnowcurrently at gmail.com>wrote:

> 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")>.
>
> 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
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20110819/c8a2825c/attachment.html>


More information about the Python-list mailing list