So, the class of a class is typically type
, and when you call Class()
the __call__()
method on Class
's class handles that. I believe type.__call__()
is implemented more or less like this:
def __call__(cls, *args, **kwargs):
# should do the same thing as type.__call__
obj = cls.__new__(cls, *args, **kwargs)
if isinstance(obj, cls):
obj.__init__(*args, **kwargs)
return obj
The direct answer to your question is no, the things that __init__()
can do (change / "initialize" a specified instance) is a subset of the things that __new__()
can do (create or otherwise select whatever object it wants, do anything to that object it wants before the object is returned).
It's convenient to have both methods to use, however. The use of __init__()
is simpler (it doesn't have to create anything, it doesn't have to return anything), and I believe it is best practice to always use __init__()
unless you have a specific reason to use __new__()
.