27
class MyClass:
    def myMethod(self):
        pass

myInstance = MyClass()

methodReference = myInstance.myMethod

Now can you get a reference to myInstance if you now only have access to methodReference?

1
  • 2
    methodReference.im_self (dir() is your friend) Commented Jan 29, 2013 at 17:44

3 Answers 3

43

Try this:

methodReference.im_self

If you are using Python 3:

methodReference.__self__
Sign up to request clarification or add additional context in comments.

1 Comment

old question, but this should now be the accepted answer as it's the only one to provide a solution for python3
9

If you are using Python 3:

methodReference.__self__

Otherwise:

methodReference.im_self

and by a similar token, for the class:

methodReference.im_class

For this kind of code discovery you should install iPython and use tab, for instance, in your case myReference.+TAB would give:

In [6]: methodReference. methodReference.im_class 
methodReference.im_func   methodReference.im_self

Hence, you don't need to worry about remembering things so much - you know that the method is probably provided by the function object and from the suggestions that iPython gives it's usually obvious what method/attribute you're looking for.

2 Comments

This doesn't work in Python 3. See @dusan answer.
@Evgeny thanks - this answer was from 2013, I updated my answer.
1

You can work this out yourself - have a look at the dir output:

>>> dir(mr)
['__call__', ... '__str__', '__subclasshook__', 'im_class', 'im_func', 'im_self']

The im_* instances refer to attributes defined for instance methods...

The class it was defined in, the function code block, and the object it is bound to...

1 Comment

The reason I slightly prefer the iPython approach I detail above is that it hides special methods/attributes and formats on the screen slightly cleaner. But of course they're pretty equivalent in terms of functionality and your suggestion doesn't tie the user down to iPython either.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.