__init__ is the initialiser

MRAB python at mrabarnett.plus.com
Fri Jan 31 15:48:10 EST 2014


On 2014-01-31 19:52, Ned Batchelder wrote:
> 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?
>
The advantage of calling it the "initialiser" is that it explains why
it's called "__init__".




More information about the Python-list mailing list