What is the semantics meaning of 'object'?

Steven D'Aprano steve+comp.lang.python at pearwood.info
Mon Jun 24 02:31:39 EDT 2013


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>'


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.

But your point is well taken. It's not just purely a speed optimization.


> This is explained here:
> 
> http://docs.python.org/3.3/reference/datamodel.html#special-lookup


Nice link, thank you.


-- 
Steven



More information about the Python-list mailing list