I've been in this Python mailing list for a few days, and I've noticed several things here: There are too many fundamentalist!
Don't play stupid and all, don't be a fundamentalist. It might be true that __init__ isn't a constructor and __new__ might be the constructor (some people even claimed __new__ is also not a constructor). >From the base definition of a constructor: constructor is the creator of an object. In this case, __new__ is technically the constructor while __init__ is an initializer. However, it is also to be noted that __init__ is what makes an object meaningful, and that makes it a constructor in a sense (while still technically a constructor). Without initialization, an object is meaningless, even if the definition of the initializer is to leave it as it is. Python creates object by doing something like this: a = anObject(arg1, arg2, arg3) These arguments is then passed to __new__ and __init__ for their arguments in its sake of creating and initializing the object. Then anObject() returns an instance of anObject. >From an outsider's point of view, there is no difference between __new__ and __init__ since they're "implementation details" (in other languages, these are private functions[1] that is invisible to outsiders, Python doesn't like privacy but the semantic of being implementation detail still exist). For an outsider, there is absolutely no need to know that __new__ and __init__ exists, they just need to know anObject()'s arguments, which is the public view of the constructor and initializer[2]. [1] Well, for fundamentalists: constructors aren't usually private though, usually they're Friend or Protected Friend which prohibits outsiders from calling it but allow other classes inheriting from it to call them. [2] In this sense, from outsider's POV anObject() is the constructor. If you can't be convinced with this argument, then I'd give you another that's a bit more Pythonic: DUCK TYPING: If it looks like a duck, walks like a duck, and quacks like a duck, it is a duck! >From the class programmer's point of view, __init__ acts like an object constructor in other languages, there is no significant difference between __init__ and constructor in other languages. The fact that __init__ works with side-effect as opposed to returning the object is not a significant point and can be considered as an implementation difference (I'm not aware of any major programming language that returns an instance of itself in its return value [except for Python]). For example, in VB.NET, there is no doubt that Sub New() is a constructor, despite New() works only by side effect, and returning anything results in an error (since it is a Sub or a method in Python's dictionary). Not only VB, C++ and C# also use side effect in its constructors and doesn't return a value. In this sense, VB's New, C ++ constructor, and C# constructor is equal to Python's __init__, thus the Duck Typing spirit applies here. -- http://mail.python.org/mailman/listinfo/python-list