overloading __getattr__ and inheriting from dict

Michael Hudson mwh at python.net
Mon Mar 15 07:58:30 EST 2004


Benoît Dejean <bnetNOSPAM at ifrance.com> writes:

> class TargetWrapper(dict):
> 
>     def __init__(self, **kwargs):
>         dict.__init__(self, kwargs)
> 
>     __getattr__ = dict.__getitem__
>     __setattr__ = dict.__setitem__
>     __delattr__ = dict.__delitem__
> 
> 
> 
> then 
> 
> tw = TargetWrapper()
> tw.a = "spam" # ok
> del tw.a # ok
> tw.b = "egg"
> print tw.b
> 
> last line give me an
> AttributeError: 'TargetWrapper' object has no attribute 'b'
> 
> if i define
> 
>     def __getitem__(self, name):
>         return dict.__getitem__(self, name)
> 
>     __getattr__ = __getitem__
> 
> then the accessing the b attribute is ok. what's wrong ?

I'm not sure, but changing 

    __getattr__ = dict.__getitem__

to 

    __getattribute__ = dict.__getitem__

makes things behave more like I think you expect.

Cheers,
mwh

-- 
  Of course, it obviously is beta hardware so such things are to be
  expected, but that doesn't mean that you can't point your fingers
  and generate a nelson style HAHA at a multi billion dollar
  corporation's expense.                   -- CmdrTaco on slashdot.org



More information about the Python-list mailing list