Note: this is an excerpt from the PyPy documentation. On Nov. 19, 2014 I ran this test on PyPy 2.4.0 and PyPy3 2.4.0 and the result was not as described, but was the same as with CPython: 'foo'.
Officially, CPython has no rule at all for when exactly
overridden method of subclasses of built-in types get
implicitly called or not. As an approximation, these methods
are never called by other built-in methods of the same object.
For example, an overridden __getitem__() in a subclass of
dict will not be called by e.g. the built-in get()
method.
The above is true both in CPython and in PyPy. Differences
can occur about whether a built-in function or method will
call an overridden method of another object than self.
In PyPy, they are generally always called, whereas not in
CPython. For example, in PyPy, dict1.update(dict2)
considers that dict2 is just a general mapping object, and
will thus call overridden keys() and __getitem__()
methods on it. So the following code prints 42 on PyPy
but foo on CPython:
>>> class D(dict):
... def __getitem__(self, key):
... return 42
...
>>>
>>> d1 = {}
>>> d2 = D(a='foo')
>>> d1.update(d2)
>>> print(d1['a'])
42