On 12/15/2016 2:04 PM, Ian Kelly wrote:
On Thu, Dec 15, 2016 at 11:05 AM, Terry Reedy <tjre...@udel.edu> wrote:
On 12/14/2016 11:14 PM, Thomas 'PointedEars' Lahn wrote:

According to
<https://docs.python.org/3/tutorial/classes.html#method-objects>,
“Foo.__init__” is _not_ an instance method.  Were it an instance
method, the following would not happen:


This link points to subsection 9.3.4. Method Objects

| >>> class Foo:
| ...     def __init__ (self):
| ...         pass
| ...
| >>> Foo.__init__.__self__
| Traceback (most recent call last):
|   File "<stdin>", line 1, in <module>
| AttributeError: 'function' object has no attribute '__self__'


You have misread the docs.  Foo.__init__ is the function. Foo().__init__ is
a method object with the attribute __self__.  You omitted the ()s.

I think this is actually the point that Thomas was making. He was
responding to the assertion that "Foo.__init__" is an instance method
and demonstrating that it's false because Foo is the class, not an
instance of Foo.

The __init__ function *is* an 'instance method', but not a (bound) method object. The distinction is important. I admit that 'instance method' can be confusing if one does not understand the contextual meaning of the two words. A 'method' is a function that is a class attribute. Being a method normally adds special behavior to the function. An 'instance method', the default status of a method, takes an *instance of the class* (or subclass) as first parameter. A 'class method' (relatively rare) takes the *class* (or subclass) as first parameter. A 'static method' (very rare) takes neither as first parameter and is really just a function.

--
Terry Jan Reedy


--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to