'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")>.
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
>
More information about the Python-list
mailing list