> On 01/02/2014 14:40, Roy Smith wrote: > > In article <mailman.6275.1391257695.18130.python-l...@python.org>, > > Ned Batchelder <n...@nedbatchelder.com> wrote: > > > >> The existence of __new__ is an > >> advanced topic that many programmers never encounter. Taking a quick > >> scan through some large projects (Django, edX, SQLAlchemy, mako), the > >> ratio of __new__ implementations to __init__ implementations ranges from > >> 0% to 1.5%, which falls into "rare" territory for me. > > > > From our own codebase: > > > > $ find . -name '*.py' | xargs grep 'def.*__new__' | wc -l > > 1 > > $ find . -name '*.py' | xargs grep 'def.*__init__' | wc -l > > 228 > > > > Doing the same searches over all the .py files in our virtualenv, I get > > 2830 (__init__) vs. 50 (__new__).
In article <mailman.6280.1391267257.18130.python-l...@python.org>, Mark Lawrence <breamore...@yahoo.co.uk> wrote: > You could remove all 228 __init__ and still get your code to work by > scattering object attributes anywhere you like, something I believe you > can't do in C++/Java. Why not? Here's a simple C++ program which uses a constructor: #include <stdio.h> class Foo { public: int i; Foo() : i(42) {} }; int main(int, char**) { Foo foo; printf("foo.i = %d\n", foo.i); } If I wanted to, I could remove the constructor and still "get my code to work by scattering object attributes anywhere I like": #include <stdio.h> class Foo { public: int i; }; int main(int, char**) { Foo foo; foo.i = 42; printf("foo.i = %d\n", foo.i); } > I doubt that you could remove the single __new__ and get your code to work. Perhaps. Looking at our own code, the one place we use __new__ is in a metaclass, which I think pretty well reinforces Ned's assertion that __new__ is an advanced topic. -- https://mail.python.org/mailman/listinfo/python-list