New features of classes
=======================

A class can implement certain operations that are invoked by special
syntax (such as subscription or arithmetic operations) by defining
methods with special names.


Special methods for any type
----------------------------

__repr__(self) --> string

Used by the print statement and conversions (reverse quotes) to
compute the string representation of an object.

__cmp__(self, other) --> int

Used by all comparison operations.  Should return -1 if self<other, 0
if self==other, +1 if self>other.  Due to limitations in the
interpreter, exceptions raised by comparisons are ignored, and the
objects will be considered equal in this case.


Special methods for sequence and mapping types
----------------------------------------------

__len__(self) --> int

Used by the built-in function len().  Should return the length of the
object, which should be >= 0.  Also, an object whose __len__() method
returns 0 

__getitem__(self, key) --> value

Used to implement value = self[key].  Note that the special
interpretation of negative keys (if the class wishes to emulate a
sequence type) is up to the __getitem__ method.

__setitem__(self, key, value)

Used to implement self[key] = value.  Same note as for __getitem__.

__delitem__(self, key)

Used to implement del self[key].  Same note as for __getitem__.


Special methods for sequence types
----------------------------------

__getslice__(self, i, j) --> sequence

Used to implement self[i:j].  Note that missing i or j are replaced by
0 or len(self), respectively, and len(self) has been added to negative
i or j.

__setslice__(self, i, j, sequence)

Used to implement self[i:j] = value.  Same note as for __getslice__.

__delslice__(self, i, j)

Used to implement del self[i:j].  Same note as for __getslice__.


Special methods for numeric types
---------------------------------

__add__, __sub__, __mul__, __div__, __mod__, __divmod__, __pow__,
__lshift__, __rshift__, __and__, __xor__, __or__

Used to implement the binary arithmetic operations (divmod and pow are
called by built-in functions).  All have the call pattern
func(self, other) --> number.

__neg__, __pos__, __abs__, __invert__

Used to implement the unary arithmetic operations (-, +, abs and ~).
All have the call pattern func(self) --> number.

__nonzero__(self) --> int

Used to implement boolean testing.  An alternative name for this
method is __len__.

__coerce__(self, other) --> (self1, other1) or None

Used to implement "mixed-mode" numeric arithmetic.  Either return a
tuple containing self and other converted to some common type, or None
if no way of conversion is known.  When the common type would be the
type of other, it is sufficient to return None, since the interpreter
will also ask the other object to attempt a coercion (but sometimes,
if the implementation of the other type cannot be changed, it is
useful to do the conversion to the other type here).

__int__(self) --> int
__long__(self) --> long
__float__(self) --> float

Used to implement the built-in functions int(), long() and float().


Notes
-----

Except for __repr__ and __cmp__, when no appropriate method is
defined, attempts to execute the operation raise an exception.  For
__repr__ and __cmp__, the traditional interpretations are used
in this case.
