ast wrote: > > "Lawrence D’Oliveiro" <lawrenced...@gmail.com> a écrit dans le message de > news:f5314bdd-a98f-4a16-b546-bd8efe4dd...@googlegroups.com... >> On Thursday, October 6, 2016 at 7:54:08 PM UTC+13, ast wrote: >>> But there is no decorator, why ? Is python doing the conversion >>> of funct2 to a descriptor itself, behind the scene ? >> >> Every function is already a descriptor. So you get the instance-method >> behaviour automatically. >> >>> * static methods are decorated too >> >> This is to turn off the instance-method behaviour. > > > I do not understand your answer. > Consider this function: > > def add(a, b): > return a+b > > You say that a function is always stored as > a descriptor object, so when I execute > > sum = f(4, 6) > > from which class it is supposed to come from ?
It doesn't matter. You can invoke it in the usual way >>> def add(a, b): return a + b ... >>> add(2, 3) 5 and even put it into an instance: >>> class A: pass ... >>> a = A() >>> a.foo = add >>> a.foo(3, 4) 7 Only when you put it into a class the first argument will be the instance >>> A.bar = add >>> a.bar(5, 6) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: add() takes 2 positional arguments but 3 were given because under the hood add.__get__() is invoked. Doing it manually: >>> add.__get__(a)(5, 6) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: add() takes 2 positional arguments but 3 were given Unlike Python functions those implemented in C don't support the descriptor protocol out of the box, so >>> A.baz = sum >>> a.baz([1,2,3]) 6 does not pass the instance a as an argument. -- https://mail.python.org/mailman/listinfo/python-list