title: What can `__init__` do that `__new__` cannot?
body: <p>In Python, <code>__new__</code> is used to initialize immutable types and <code>__init__</code> typically initializes mutable types.  If <code>__init__</code> were removed from the language, what could no longer be done (easily)?</p>
  
  <p>For example,</p>
  
  <pre><code>class A:
  
      def __init__(self, *, x, **kwargs):
          super().__init__(**kwargs)
          self.x = x
  
  
  class B(A):
  
      def __init__(self, y=2, **kwargs):
          super().__init__(**kwargs)
          self.y = y
  </code></pre>
  
  <p>Could be rewritten using <code>__new__</code> like this:</p>
  
  <pre><code>class A_N:
  
      def __new__(cls, *, x, **kwargs):
          obj = super().__new__(cls, **kwargs)
          obj.x = x
          return obj
  
  
  class B_N(A_N):
  
      def __new__(cls, y=2, **kwargs):
          obj = super().__new__(cls, **kwargs)
          obj.y = y
          return obj
  </code></pre>
  
  <hr>
  
  <p>Clarification for scope of question:  This is not a question about how <code>__init__</code> and <code>__new__</code> are used or what is the difference between them.  This is a question about what would happen if <code>__init__</code> were removed from the language.  Would anything break?  Would anything become a lot harder or impossible to do?</p>