title: Why is a method of a Python class declared without "self" and without decorators not raising an exception?
body: <p>I thought that the following code would result in an error because as far as I have read, a method in a Python class must either have "self" (or any other label, but "self" by convention) as its first argument, or "cls" or similar if the <code>@classmethod</code> decorator is used, or none if the <code>@staticmethod</code> decorator is used.</p>
  
  <p>How come I get no error running this with Python 3.5 in the Terminal, even though <code>test_method</code> does not meet these requirements? It seems to work fine as a static method, but without the decorator.</p>
  
  <pre><code>#!/usr/bin/env python3
  # -*- coding: utf-8 -*-
  
  import sys
  
  class MyClass:
  
      def test_method(args):
          print(args[1])
  
      @staticmethod
      def static_method():
          print("static_method")
  
      @classmethod
      def class_method(cls):
          print("class_method")
  
  
  def main(args):
      MyClass.test_method(args)
  
  
  if __name__ == '__main__':
      sys.exit(main(sys.argv))
  </code></pre>
  
  <p>Output:</p>
  
  <pre><code>$ python3 testscript.py "testing"
  $ testing
  </code></pre>
  
  <p><strong>EDIT</strong>:</p>
  
  <p>My question could also be phrased differently, drawing attention away from <code>self</code> and to <code>@staticmethod</code>: "How come I'm getting a seemingly working static method without the @staticmethod decorator?"</p>