What is the difference between a Python staticmethod and a classmethod?
The difference is what the method receives as its first argument. An ordinary instance method receives the instance, so its first parameter is named self. A classmethod receives the class, so its first parameter is named cls. A staticmethod receives nothing at all, because it has no implicit first parameter.
That single difference decides everything else. A staticmethod is really just a plain function that happens to live inside the class body, so it cannot reach the class or any instance. A classmethod can reach class-level data, and more importantly it can build new instances by calling cls(...), which is why it is the right tool for alternative constructors and for factory methods.
Both of them are usually called through the class name, which is how you would normally use them. The subtle part is that neither one is affected by being called through an instance. A staticmethod and a classmethod both ignore the instance they were accessed through, so obj.helper() behaves in exactly the same way as Class.helper(). If a method needs the data of the object itself, then it has to be an ordinary instance method.
Two naming conventions complete the picture. The style guide says that a classmethod's first parameter should be called cls and not self, so that a reader knows at once what it holds. The classmethod and staticmethod decorators have both been available since Python 2.4, and you will still meet older code that calls them directly as built-in functions on a class.