title: Does Python have a default constructor for classes?
body: <p>I was asking myself whether Python3.6 had a default constructor for classes. So I wrote some code to test this. But I'm left with more questions than when I started testing this.</p>
  
  <p>I'm trying to understand why myCat constructed ok on line 11 of my program, yet I can't explain why line 27 of my program demanded to know itself</p>
  
  <p>Please, if you can help, review this Python code and the output... does it make sense? 
  I made 2 files animal.py and an_test_program.py.</p>
  
  <pre><code>#!/usr/bin/env python3
  #animal.py file  ==============================
  class animal:
      name = ""
      height = 0
      weight = 0
  
      def __init__( self, name, height, weight):
          self.name = name
          self.height = height
          self.weight = weight
  
      def printvars(self):
          print(self.name)
          print(self.height)
          print(self.weight)
  
  
  #!/usr/bin/env python3
  #an_animal_program.py ==============================
  import animal as an
  
  #Instantiate a variable of type animal using the special constructor of the class
  myDog = an.animal('Capitan', 30, 70)
  print('myDog\'s name is ' + myDog.name)
  myDog.printvars()
  
  #now play around with Python and discover some things...
  #Instantiate a variable of type animal without using the special constructor
  myCat = an.animal
  print('myCat\'s name is ' + myCat.name)
  print('myCat\'s height is ' + "%d" % (myCat.height))
  print('myCat\'s weight is ' + "%d" % (myCat.weight))
  
  #notice everything in myCat is empty or zero
  #thats because myCat is not initialized with data
  #none-the-less myCat is a viable object, otherwise Python would puke out myCat
  
  myCat.name = 'Backstreet'
  print('myCat\'s name is ' + myCat.name) # now myCat.name has data in it
      #Ouch... this next line produces an error:
      #myCat.printvars()
      #"an_test_program.py", line 21, in &lt;module&gt;
      #    myCat.printvars()
      #TypeError: printvars() missing 1 required positional argument: 'self'
  myCat.printvars(myCat)   #ok, I'm rolling with it, but this is wierd !!!
  
  #oh well, enough of the wierdness, see if the myCat var can be
  #reinstantiated with an animal class that is correctly constructed
  myCat = an.animal('Backstreet', 7, 5)
  myCat.printvars()
  
  #I'm trying to understand why myCat constructed ok on line 11
  #But I can't explain why line 27 demanded to know itself
  #the output is:
  # RESTART: an_test_program.py 
  #myDog's name is Capitan
  #Capitan
  #30
  #70
  #myCat's name is 
  #myCat's height is 0
  #myCat's weight is 0
  #myCat's name is Backstreet
  #Backstreet
  #0
  #0
  #Backstreet
  #7
  #5
  </code></pre>