In a statically typed language, the default state of an object is defined by its object definition. When we instantiate that object memory is allocated into this default state, a constructor is then run to customise the instance.
Python mimics this pattern in that __new__ produces a default instance of the class and __init__ customises it.
__init__ is fulfilling the constructor part of the pattern.
If you start customising the object in new you risk having those changes overwritten by init as it is always executed on the instance returned by new.
From the python docs
from new
new() is intended mainly to allow subclasses of immutable types (like int, str, or tuple) to customize instance creation. It is also commonly overridden in custom metaclasses in order to customize class creation.
from init
Because new() and init() work together in constructing objects (new() to create it, and init() to customize it), no non-None value may be returned by init(); doing so will cause a TypeError to be raised at runtime.
In a statically typed language, the default state of an object is defined by its object definition. When we instantiate that object memory is allocated into this default state, a constructor is then run to customise the instance.
Python mimics this pattern in that
__new__
produces a default instance of the class and__init__
customises it.__init__
is fulfilling the constructor part of the pattern.If you start customising the object in new you risk having those changes overwritten by init as it is always executed on the instance returned by new.
From the python docs
from new
from init
Very insightful