Here is the creator of Python explaining it:
… rather than devising a new syntax for
special kinds of class methods (such
as initializers and destructors), I
decided that these features could be
handled by simply requiring the user
to implement methods with special
names such as__init__
,__del__
, and
so forth. This naming convention was
taken from C where identifiers
starting with underscores are reserved
by the compiler and often have special
meaning (e.g., macros such as
__FILE__
in the C preprocessor).
…
I also used this technique to allow
user classes to redefine the behavior
of Python’s operators. As previously
noted, Python is implemented in C and
uses tables of function pointers to
implement various capabilities of
built-in objects (e.g., “get
attribute”, “add” and “call”). To
allow these capabilities to be defined
in user-defined classes, I mapped the
various function pointers to special
method names such as__getattr__
,
__add__
, and__call__
. There is a
direct correspondence between these
names and the tables of function
pointers one has to define when
implementing new Python objects in C.