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 think by "person using instances of a class" Terry referred to the
user of a class as opposed to the implementor.  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).  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.

Obviously, none of this applies to __dict__, __class__, and friends, nor
does it apply to cases where you know what you're doing, such as
invoking __<method>__ of a superclass.

> (This may change in the future. Given type(), and isinstance(), I'm not 
> sure what value __class__ adds.)

None whatsoever.  __class__ used to be necessary to tell the appart
instances of different old-style classes:

>>> class X: pass  # old-style
...
>>> X().__class__
<class __main__.X at 0xb772f2fc>
>>> type(X())
<type 'instance'>

Now that classes produce real types, they are equivalent.
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to