Python functions have descriptors. I believe, in most cases I shouldn't use this directly, but I want to know how it is works? I tried a couple of manipulations with such objects:
'descr.__get__(obj[, type]) -> value'
TypeError: expected at least 1 arguments, got 0
<bound method ?.a of 's'>
TypeError: a() takes no arguments (1 given)
>>> def d(arg1, arg2, arg3):
return arg1, arg2, arg3
>>> d.__get__('s')('x', 'a')
('s', 'x', 'a')
a.__get__ is a way to bind a function to an object. Thus:
class C(object): pass def a(s): return 12 a = a.__get__(C)
is the rough equivalent of
class C(object): def a(self): return 12
(Though it's not a good idea to do it this way. For one thing,
C won't know that it has a bound method called
a, which you can confirm by doing
dir(C). Basically, the
__get__ does just one part of the process of binding).
That's why you can't do this for a function that takes no arguments- it must take that first argument (traditionally
self) that passes the specific instance.