overriding __getitem__ for a subclass of dict

Jon Clements joncle at googlemail.com
Sun Nov 15 15:01:00 EST 2009


On Nov 15, 7:23 pm, Steve Howell <showel... at yahoo.com> wrote:
> On Nov 15, 10:25 am, Steve Howell <showel... at yahoo.com> wrote:
>
> > [see original post...]
> > I am most
> > interested in the specific mechanism for changing the __getitem__
> > method for a subclass on a dictionary.  Thanks in advance!
>
> Sorry for replying to myself, but I just realized that the last
> statement in my original post was a little imprecise.
>
> I am more precisely looking for a way to change the behavior of foo
> ['bar'] (side effects and possibly return value) where "foo" is an
> instance of a class that subclasses "dict," and where "foo" is not
> created by me.  The original post gives more context and example code
> that does not work as I expect/desire.

[quote from http://docs.python.org/reference/datamodel.html]
For instance, if a class defines a method named __getitem__(), and x
is an instance of this class, then x[i] is roughly equivalent to
x.__getitem__(i) for old-style classes and type(x).__getitem__(x, i)
for new-style classes.
[/quote]

A quick hack could be:

class Al(dict):
  def __getitem__(self, key):
    return self.spy(key)
  def spy(self, key):
    return 'Al'

>>> a = Al()
>>> a[3]
'Al'
>>> a.spy = lambda key: 'test'
>>> a[3]
'test'
>>> b = Al()
>>> b[3]
'Al'

Seems to be what you're after anyway...

hth,
Jon.



More information about the Python-list mailing list