On 9/29/2010 8:34 AM, Hrvoje Niksic wrote:
Steven D'Aprano<st...@remove-this-cybersource.com.au>  writes:

On Wed, 29 Sep 2010 02:20:55 +0100, MRAB wrote:

On 29/09/2010 01:19, Terry Reedy wrote:

A person using instances of a class should seldom use special names
directly. They are, in a sense, implementation details, even if
documented. The idiom "if __name__ == '__main__':" is an exception.

__file__ is another exception.

As are __iter__, __next__, __add__, __dict__, and, yes, __class__, to
say nothing of all the other special methods.

I strongly disagree.

I think by "person using instances of a class" Terry referred to the
user of a class as opposed to the implementor.

Yes.

 In that sense the user
should be calling iter(foo) instead of foo.__iter__(), next(foo) instead
of foo.__next__(), and foo+bar instead of foo.__add__(bar).

Yes. Guido added iter() and next() to the list of built-in functions, even though they seem reduncant.. I believe it is his intention that the use of special names outside of class statements should be fairly rare.

If I remember right, in the old, pre-2.2 system that separated built-in types and user-written classes, the builtins did not have accessible special method attributes. They are only for customizing user classes. So one could not have generically written foo.__add__(bar). Special-method attribute were added to builtins so that they could be inherited (or replaced) by user-written subclasses, not so that one could replace normal syntax.

>  Direct
calls to special-name methods, such as __len__, often indicate that the
programmer hasn't grasped how those methods are intended to be used in
Python.

Right. That fact that *Python* interpreters implement syntax with special methods is an implementation detail of the *language*. The importance is that it allow *writers* of new classes to rather easily imitate built-in classes so that their classes seamlessly plug into the syntax.

--
Terry Jan Reedy

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

Reply via email to