Distinguishing between functions and methods in a decorator.
Diez B. Roggisch
deets at nospam.web.de
Thu Feb 7 12:22:03 EST 2008
Berteun Damman schrieb:
> 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?
>
> The reason for asking is that I would like to differentiate between
> wrapping a function and an instancemethod, because in the latter case,
> the first parameter will be the implicit 'self', which I would like to
> ignore. However, when the wrapping occurs, the method still looks like
> a function.
Can you provide an example of what you are actually after? The
descriptor-protocol might come to use there.
Diez
More information about the Python-list
mailing list