Ned Batchelder <n...@nedbatchelder.com> writes: > Claiming that __init__ isn't a constructor seems overly pedantic to > me.
Whereas to me, claiming that ‘Foo.__init__’ is a constructor seems needlessly confusing. * Classes already have a constructor, ‘Foo.__new__’. If we call something else the constructor, what do we call ‘__new__’? Are they both constructors? * A constructor for Foo should start from “no instance” and result in “an instance of Foo”. ‘Foo.__init__’ does not do that; ‘Foo.__new__’ does. * A constructor should return the instance. ‘Foo.__init__’ does not do that; ‘Foo.__new__’ does. If the differences didn't matter I would agree that “overly pedantic” is fair. But those differences trip up newcomers. Thinking of ‘Foo.__init__’ leads people to wonder where the ‘self’ attribute came from – am I not meant to be constructing it? — and to attempt to return that instance. And when the time comes to lean about ‘__new__’ the confusion continues, because the newcomer has been told that something *else* is the constructor, so what's this? > What's true is that Python's constructors (__init__) are different than > C++ constructors. In C++, you don't have an object of type T until the > constructor has finished. In Python, you have an object of type T before > __init__ has been entered. I'm not going to argue that C++ should define terminology for other languages. But “constructor” should have a close correlation with the normal English-language meaning of the term. That meaning matches ‘Foo.__new__’, which makes that method a constructor. It does not match ‘Foo.__init__’, which makes that method not a constructor. > The reason to call __init__ a constructor is because of what is the > same between C++ and Python: the constructor is where the author of > the class can initialize instances of the class. So you've just described what ‘Foo._init__’ does: it initialises the existing instance. That's why it is better to call it the “initialiser”, a term we already have and use correctly. -- \ “DRM doesn't inconvenience [lawbreakers] — indeed, over time it | `\ trains law-abiding users to become [lawbreakers] out of sheer | _o__) frustration.” —Charles Stross, 2010-05-09 | Ben Finney -- https://mail.python.org/mailman/listinfo/python-list