title: Forbid the usage of the default constructor from outside the class
body: <p>Consider the following dataclass.  I would like to prevent objects from being created using the <code>__init__</code> method direclty. </p>
  
  <pre><code>from __future__ import annotations
  from dataclasses import dataclass, field
  
  @dataclass
  class C:
      a: int
  
      @classmethod
      def create_from_f1(cls, a: int) -&gt; C:
          # do something
          return cls(a)
      @classmethod
      def create_from_f2(cls, a: int, b: int) -&gt; C:
          # do something
          return cls(a+b)
  
      # more constructors follow
  
  
  c0 = C.create_from_f1(1) # ok
  
  c1 = C()  # should raise an exception
  c2 = C(1) # should raise an exception
  </code></pre>
  
  <p>For instance, I would like to force the usage of the the additional constructors I define and raise an exception or a warning if an object is directly created as <code>c = C(..)</code>.</p>
  
  <p>What I've tried so far is as follows.</p>
  
  <pre><code>@dataclass
  class C:
      a : int = field(init=False)
  
      @classmethod
      def create_from(cls, a: int) -&gt; C:
          # do something
          c = cls()
          c.a = a
          return c
  </code></pre>
  
  <p>with <code>init=False</code> in  <code>field</code> I prevent <code>a</code> from being a parameter to the generated <code>__init__</code>, so this partially solves the problem as <code>c = C(1)</code> raises an exception.<br>
  Also, I don't like it as a solution.</p>
  
  <p>Is there a direct way to disable the <strong>init</strong> method from being called from outside the class?</p>