Distinguishing between functions and methods in a decorator.

Diez B. Roggisch deets at nospam.web.de
Thu Feb 7 17:25:36 CET 2008

Berteun Damman wrote:

> Hello,
> I was wondering a bit about the differences between methods and
> functions. I have the following:
> def wrap(arg):
>     print type(arg)
>     return arg
> class C:
>     def f():
>         pass
>     @wrap
>     def g():
>         pass
> def h():
>     pass
> print type(C.f)
> print type(h)
> Which gives the following output:
> <type 'function'>
> <type 'instancemethod'>
> <type 'function'>
> The first line is caused by the 'wrap' function of course. I had
> expected the first line to be 'instancemethod' too. So, I would guess,
> these methods of C are first created as functions, and only then become
> methods after they are 'attached' to some classobj. (You can do that
> yourself of course, by saying, for example, C.h = h, then the type of
> C.h is 'instancemethod' too.)
> Why does the wrapping occur before the function is 'made' into an
> instancemethod?

Because a decorator could choose to return any function-object as it likes,
see this example:

def bar(self):
    print "bar"

def makebar(f):
    return bar

class Foo(object):

   def baz(self):

foo = Foo()

So you can't decide if a function is an instancemethod until the very last


More information about the Python-list mailing list