On 23/06/2013 18:29, Steven D'Aprano wrote:
On Sat, 22 Jun 2013 23:40:53 -0600, Ian Kelly wrote:
[...]

Can you elaborate or provide a link?  I'm curious to know what other
reason there could be for magic methods to behave differently from
normal methods in this regard.

It's an efficiency optimization. I don't quite get the details, but when
you run something like "a + b", Python doesn't search for __add__ using
the normal method lookup procedure. That allows it to skip checking the
instance __dict__, as well as __getattribute__ and __getattr__.

It's not just an efficiency optimisation, it's actually necessary in cases where a dunder method gets called on a type. Consider what happens when one calls repr(int), for example - if this tried to call int.__repr__() by the normal lookup method, it would call the unbound __repr__ method of int with no self argument:

>>> int.__repr__()
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    int.__repr__()
TypeError: descriptor '__repr__' of 'int' object needs an argument

By bypassing the instance-first lookup and going straight to the object's type's dictionary, repr(int) instead calls type.__repr__(int), which works:

>>> type.__repr__(int)
"<class 'int'>"

This is explained here:

http://docs.python.org/3.3/reference/datamodel.html#special-lookup
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to