On 6/28/2011 11:35 AM, Michael Foord wrote:
On 28/06/2011 16:23, Terry Reedy wrote:
So-called 'staticmethods' are not really methods either, but are class
function attributes that are just functions and not treated as
methods. The decorator that negates normal method treatment
could/should have been called 'non_method'.
Using 'function' is its generic 'callable' sense ...
Method: a class function attribute that in its intended and normal use
automagically turns the object it is called on into its first arg.
'Method' is a useful and needed subcategory of class attribute
precisely because of this behavior.
Instance method: a class function attribute that is (normally) called
on instances of the class or subclasses.
Before 2.2, these were the only methods.
So what is the difference between "Instance method" and "Method" above?
Is it just that "Method" is broader and includes class methods
Since 2.2, yes. The current glossary entry starts
"method A function which is defined inside a class body."
This includes 'staticmethods', but as I have said, I think that is a
mistake. Static methods are functions without special method treatment.
A class staticmethod function act the same as any other function.
Also, 'defined inside' is not necessary.
I would change the above to "A function that get bound to a instance or
class when called as an attribute of the instance or class. Methods are
usually defined inside a class body."
and bound methods?
The result of accessing an instance or class method via an instance or
class. Accessing a static method does not create a bound method. Bound
methods are usually anonymous and ephemeral, being used for one call and
then deleted.
If anyone said "instance method" to me I would assume they meant bound
method. (A normal method fetched from an instance.)
Instance methods are the 'permanent' class function attributes, not the
ephemeral object that implements a.b(c). Bound methods would be an
implementation detail, except that a.b has to evaluate to something and
saving bound methods is quite handy when calling a method or methods
repeatedly on the same instance.
Functools.partial is a generalization of bound methods, which were
Python's first (special-case) implementation of the partial function
idea. Leaving out implementation details, if b is a function attribute
of type(a), 'a.b' is an abbreviated way of writing
'functools.partial(type(a).b,a)' (and yes, I have tested an example of
this).
Class method: a class function attribute that is (normally) called on
the class or subclasses.
Bound method: a method that has already has the first-arg object
bundled with it, so that it can be used as a normal (partial or
curried) function.
---
Terry Jan Reedy
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com