On 24/06/2013 07:31, Steven D'Aprano wrote:
On Mon, 24 Jun 2013 02:53:06 +0100, Rotwang wrote:

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:


I don't know about *necessary*, after all, classic classes manage just
fine in Python 2.x:

py> class OldStyle:
...     def __repr__(self):
...             return "Spam"
...
py> repr(OldStyle())
'Spam'
py> repr(OldStyle)
'<class __main__.OldStyle at 0xb7553e0c>'

Point taken. It's also possible to override the __repr__ method of an old-style instance and have the change recognised by repr, so repr(x) isn't simply calling type(x).__repr__(x) in general.


I daresay that there are good reasons why new-style classes don't do the
same thing, but the point is that had the Python devs had been
sufficiently interested in keeping the old behaviour, and willing to pay
whatever costs that would require, they could have done so.

Sure, though the above behaviour was probably easier to achieve with old-style classes than it would have been with new-style classes because all instances of old-style classes have the same type. But I don't doubt that you're correct that they could have done it if they wanted.
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to