For my own future reference if nothing else, here's some properties relevant to finding what superclass supplies a method :
On
super()
objects, we have:
__self__
| the object you are calling
super()
about, ie the second argument. |
__self_class__
| the actual class of said object; equivalent to
.__self__.__class__
but more convenient. |
__this_class__
| the class that
super()
was invoked for, ie its first argument; this is where you are right now in the superclass hierarchy. |
(Because the MRO varies by class, you need both the real class of the object and the current class.)
Unbound methods from Python classes show up as type 'unbound method' in
repr()
, and have an
im_class
attribute that points to their class (and an
im_func
attribute that points to the actual Python function).
Some methods from builtin classes, such as
object.__init__
, show up as type 'slot wrapper'. These have an
__objclass__
attribute that points to their class.
Other methods from builtin classes, such as
object.__new__
, show up as type 'built-in method'. These have a
__self__
attribute that points to their class.
Fortunately you can tell the three types of objects apart based on what attribute they have, because nothing has more than one of them (so far; this is where I start to think that this is fishing in the implementation defined waters).