__init__ is the initialiser
Ned Batchelder
ned at nedbatchelder.com
Fri Jan 31 14:52:15 EST 2014
On 1/31/14 2:33 PM, Mark Lawrence wrote:
> From http://docs.python.org/3/reference/datamodel.html#object.__init__
> which states:-
>
> "
> Called when the instance is created. The arguments are those passed to
> the class constructor expression. If a base class has an __init__()
> method, the derived class’s __init__() method, if any, must explicitly
> call it to ensure proper initialization of the base class part of the
> instance; for example: BaseClass.__init__(self, [args...]). As a special
> constraint on constructors, no value may be returned; doing so will
> cause a TypeError to be raised at runtime.
> "
>
> Should the wording of the above be changed to clearly reflect that we
> have an initialiser here and that __new__ is the constructor?
>
I'm torn about that. The fact is, that for 95% of the reasons you want
to say "constructor", the thing you're describing is __init__. Most
classes have __init__, only very very few have __new__.
The sense that __new__ is the constructor is the one borrowed from C++
and Java: you don't have an instance of your type until the constructor
has returned. This is why __init__ is not a constructor: the self
passed into __init__ is already an object of your class.
But that distinction isn't useful in most programs. The thing most
people mean by "constructor" is "the method that gets invoked right at
the beginning of the object's lifetime, where you can add code to
initialize it properly." That describes __init__.
Insisting that __init__ is not a constructor makes about as much sense
as insisting that "Python has no variables" just because they work
differently than in C. Python has variables, and it has constructors.
We don't have to be tied to C++ semantics of the word "constructor" any
more than we have to tied to its semantics of the word "variable" or "for".
Why can't we call __init__ the constructor and __new__ the allocator?
--
Ned Batchelder, http://nedbatchelder.com
More information about the Python-list
mailing list