title: May __init__ be used as normal method for initialization, not as constructor?
body: <p>Sometimes it looks reasonable to use <code>__init__</code> as initialization method for already existing object, i.e.:</p>
  <pre><code>class A():
      def __init__(self, x):
          self.x = x
  
      def set_state_from_file(self, file):
          x = parse_file(file)
          self.__init__(x)
  </code></pre>
  <p>As alternative to this implementation I see the following:</p>
  <pre><code>class A():
      def __init__(self, x):
          self.init(x)        
  
      def init(self, x):
          self.x = x
  
      def set_state_from_file(self, file):
          x = parse_file(file)
          self.init(x)
  </code></pre>
  <p>It seems to me as over-complication of code. Is there any guideline on this situation?</p>
  <p><strong>Update:</strong> There is a case when it is definitely not an alternate constructor case: unpickling. During unpickling, pickle first creates an instance and only then sets its state.</p>