On Thu, 6 Oct 2016 05:53 pm, ast wrote: [...] > * For instance methods, there is no decorator: > > def funct2(self, a, b): > ... > > self is automatically filled with the instance when we call > funct2 from an instance and not filled if funct2 is called from > a class. > But there is no decorator, why ? Is python doing the conversion > of funct2 to a descriptor itself, behind the scene ?
Functions don't need to be decorated because they are already descriptors. Descriptors have __get__, __set__ or __delete__ methods. In the case of methods, it is __get__ which does the work. Normally this happens automatically, but we can do it by hand: py> class X(object): ... def func(self): ... pass ... py> x = X() py> vars(X)['func'] <function X.func at 0xb7b0b80c> py> vars(X)['func'].__get__(x, X) <bound method X.func of <__main__.X object at 0xb7b0ad8c>> py> x.func <bound method X.func of <__main__.X object at 0xb7b0ad8c>> > * static methods are decorated too > > @staticmethod > def funct3(a, b): > ... > > The 1st argument is not supposed to be automatically filled > So what the decorator used for ? > Just to distinguish funct3 from an instance method ? Correct. -- Steve “Cheer up,” they said, “things could be worse.” So I cheered up, and sure enough, things got worse. -- https://mail.python.org/mailman/listinfo/python-list