[Python-Dev] About 'superobject' and descriptors

Steven D'Aprano steve at pearwood.info
Thu Oct 24 01:48:51 CEST 2013


Hi Hakril,

I think this question is probably off-topic for this list. This list is 
for development of the Python compiler, not for development with Python, 
and questions like this should probably go to python-list at python.org 
(also mirrored as comp.lang.python if you have Usenet access). But I 
have a brief observation below:

On Wed, Oct 23, 2013 at 07:29:03PM +0200, hakril lse wrote:

> For example:
> 
>     # A.descr is a descriptor
>     # B inherit from A
>     # C inherit from B
> 
>         c = C()
>         c.descr
>         super(C, c).descr
>         super(B, c).descr
> 
> In these 3 cases the __get__ method is called with the same arguments
> that are : __get__(descr, c, C).
>
> If this behavior is really expected: Could you explain why ? because
> it means that I am missing something obvious.
> Because, at first sight, the 'type' argument seems to be the perfect
> place to get the type of the 'real calling class'.

I'm afraid I don't understand what you mean by "real calling class", if 
it is not the class of the instance doing the calling.

I have a feeling that perhaps you think that calls to super are 
equivalent to "the parent of the class", and so you expect:

c.desc => desc.__get__(c, C)
super(C, c).desc => desc.__get__(c, B)
super(B, c).desc => desc.__get__(c, A)

but that would not be correct. super is equivalent to "the next class in 
the MRO of the instance doing the calling", and in all cases, the 
"real-calling instance" is c, and the "real calling class" is the class 
of c, namely C.

Extended discussion of this should go to python-list, but I think I have 
the basics right.


-- 
Steven


More information about the Python-Dev mailing list