Python: how does inspect.ismethod work?

You are seeing some effects of the behind-the-scenes machinery of Python.

When you write f = MyClass.__dict__['mymethodname'], you get the raw implementation of "mymethodname", which is a plain function. To call it, you need to pass in an additional parameter, class instance.

When you write f = MyClass.mymethodname (note the absence of parentheses after mymethodname), you get an unbound method of class MyClass, which is an instance of MethodType that wraps the raw function you obtained above. To call it, you need to pass in an additional parameter, class instance.

When you write f = MyClass().mymethodname (note that i've created an object of class MyClass before taking its method), you get a bound method of an instance of class MyClass. You do not need to pass an additional class instance to it, since it's already stored inside it.

To get wrapped method (bound or unbound) by its name given as a string, use getattr, as noted by gnibbler. For example:

unbound_mth = getattr(MyClass, "mymethodname")

or

bound_mth = getattr(an_instance_of_MyClass, "mymethodname")

Use the source

def ismethod(object):
    """Return true if the object is an instance method.
    Instance method objects provide these attributes:
        __doc__         documentation string
        __name__        name with which this method was defined
        __func__        function object containing implementation of method
        __self__        instance to which this method is bound"""
    return isinstance(object, types.MethodType)

The first argument being self is just by convention. By accessing the method by name from the class's dict, you are bypassing the binding, so it appears to be a function rather than a method

If you want to access the method by name use

getattr(MyClass, 'mymethodname') 

Tags:

Python

Inspect