[Python-Dev] Issue10403 - using 'attributes' instead of members in documentation

Terry Reedy tjreedy at udel.edu
Tue Jun 28 18:12:24 CEST 2011

On 6/28/2011 9:20 AM, Steven D'Aprano wrote:

>  >>> class C:
> ... def method(self, x):
> ... return x+1
> ...
>  >>> c = C()
>  >>> c.method = types.MethodType(lambda self, x: x+101, c)

types.MethodType creates a bound method, not a method. A bound method is 
a partial or curried function, which is to say, a function.

Herw and below, I am ignoring the fact that the example ignores self. My 
comments would be the same for "lambda self,x: return self.value+x"

>  >>> c.method(1)

The fact that you make the bound function an attribute of the same 
object to which it is bound is irrelevant to how it *acts* when called. 
It only affect how you *access* it. You could bind it to anything else, 
including another instance or a plain name:

d = C()
d.method = types.MethodType(lambda self, x: x+101, c)

m = types.MethodType(lambda self, x: x+101, c)

> 102

> I don't know how rare it is, but it's a useful trick for customising the
> behaviour of instances.
> As I see it, there are three dichotomies we sometimes need to make:
> (1) Instance attributes vs class (shared) attributes.
> (2) Computed vs non-computed attributes.
> (3) Method attributes (methods) vs non-method/data attributes.

Nicely put so far...

 > The three are orthogonal:

Non-class instance function attributes are not methods in any useful sense.

 > a staticmethod is a method by virtue of being callable

A 'staticmethod' is a non-method class function attribute. The name is 
unfortunate. 'Static' mean 'does not get the dynamic method treatment'.

> Strictly speaking, (3) is not truly a dichotomy,

I disagree here. A method is usefully defined as a class function 
attribute that gets an automagic first arg when accessed and called 
'normally'. In other words, the dichotomy is needed because being a 
method affects the meaning of syntax.

> since functions and
> methods are first class-objects in Python. E.g. one may store a function
> as an attribute with the intention of using it as data rather than as a
> method.

The fact that one can *also* access a method as a function does not 
negate the effect on syntax.

> "methods are things you call"

Way too broad, even for attributes. Callable things are methods when 
'a.b(c)' causes a to be the first arg of b.

Terry Jan Reedy

More information about the Python-Dev mailing list