New-style classes and special methods
Lenard Lindstrom
len-l at telus.net
Thu May 31 01:34:17 EDT 2007
Raj B wrote:
> > Yes, special methods populate the slots in the structures which Python
> > uses to represent types. Objects/typeobject.c in the Python source
> > distribution does the hard work, particularly in function type_new
>
>
>
> Thanks for that quick response. I am quite comfortable with C code and
> am trying to understand exactly what happens when a new-style class is
> created, and then instantiated.
>
> I have been reading typeobject.c and type_new() inside it in detail, and
> there are a few issues I am trying to figure out.
>
> I can see a lot of *SLOT() macros in the file that seem to set the slots
> to appropriate values. What I am having trouble figuring out is the
> connection i.e. at what point during construction of the class object in
> type_new() are those slots allotted? Is it the tp_alloc() function which
> does this?
The place to start is the PyType_Type tp_new slot function type_new().
The second to last statement is a call to fixup_slot_dispatchers(). This
function goes through the dictionary looking for special methods and
adds the appropriate slot functions. This gets very involved. I had to
use the Visual Studio debugger to follow what was happening when trying
to figure out what happens when assigning a special method to a class
after it is declared.
>
> Is there some kind of descriptor or other mechanism connecting special
> method names with their slots in the object representation? (e.g.
> "__call__" with type->tp_call)
There is a special tp_call slot function, slot_tp_call(), that calls the
user defined __call__. The same goes for other special methods.
Descriptors only come into play with extension types. In this case if a
slot function is found a descriptor is added to make the slot function
accessible from Python as a special method.
>
> Also, what happens when a class inherits from multiple classes with
> their own __call__ methods? Where and how is it decided which __call__
> goes into the tp_call slot?
>
As Alex Martelli mentioned, __call__ is found using the method
resolution order. The tp_call slot function slot_tp_call() uses
lookup_method(), a variation of PyObject_GetAttribute(), to finding the
appropriate Python method. Its all documented in the C file.
> I'm sure I'll eventually figure it out if I stare at the code hard
> enough, but would totally appreciate any help I can get :)
>
Just ask.
--
Lenard Lindstrom
<len-l at telus.net>
More information about the Python-list
mailing list