title: Why do classes with no constructor arguments need parenthesis
body: <p>I started off learning programming/OOP in PHP. To the best of my knowledge of best practices in PHP, you can instantiate a class without parenthesis if it does not take any arguments.</p>
  
  <p>Such as </p>
  
  <pre><code>$class = new Class;
  </code></pre>
  
  <p>As opposed to:</p>
  
  <pre><code>$class = new Class();
  </code></pre>
  
  <p>I am starting to expand my skills into python and wasted about 5 hours yesterday trying to figure out why a function wouldn't pass an argument even though it was ridiculously simple. My Code:</p>
  
  <pre><code>class MainViewWidgets(MainViewContainer):
  
      def __init__(self):
          # instantiating like this prevents MainViewController.getHeaderItems from returning the arg passed to it, however the code still "works" in some sense
          self.controller = MainViewController 
  
          #this works
          self.controller = MainViewController()
  
      def createHeaderOptionCheckbox(self, pane):
          self.header_string = StringVar()
          header_checkbox = ttk.Checkbutton(pane, text='Data Contains Headers', variable=self.header_string, onvalue='headers', offvalue='keys')
          self.header_string.trace('w', self.headerOptionCheckboxChanged)
          return header_checkbox
  
      def headerOptionCheckboxChanged(self, *args):
          print(self.header_string.get())
          #will print "headers" or "keys" on checkbox toggle
          print(self.controller.getHeaderItems(self.header_string.get()))
          #prints "default"
  
  class MainViewController:
  
      def __init__(self):
          self.CheckFile = CheckFile()
          get_config = GetConfiguration('config.ini')
          self.config_file = get_config.getProperty('directory', 'input_file')
          self.csv = CSVReader(self.config_file)
          self.chosen_index = None
  
      def getHeaderItems(self, header='default'):
          return header
  </code></pre>
  
  <p>Can someone please help me understand why in Python you need to instantiate a class with parenthesis even if there are no constructor arguments other than <code>self</code>. Also, why did the <code>MainViewController</code> still kind of work, but it did not behave as I wanted it to? As in it was loaded, and the functions "did things", but it would not seem to accept arguments. Is there any advantages of instantiating a class without its parenthesis?</p>
  
  <p>Please note, I do not need help getting this code to work, I just want to understand why this happens.</p>