Instance method binds self, classmethod binds cls, staticmethod binds nothing
All three are functions stored on the class and resolved through the descriptor protocol, but they bind differently. An instance method receives the instance as the first argument. A classmethod receives the class as the first argument, whether called on the class or on an instance, which makes it useful for alternative constructors and polymorphic factories. A staticmethod receives neither: it is a plain function namespaced under the class, useful for grouping utilities or when you want no implicit binding. The mechanism is that classmethod and staticmethod are descriptors with their own get implementations, not just markers.
Use classmethod for alternative constructors (from_json, from_config) and for methods that must respect subclassing.
Use staticmethod for pure helpers that logically belong to the class but need no class or instance state.
Use instance method for anything that reads or mutates per-instance state.
Trade-off: classmethods are polymorphic through cls, which staticmethods are not. If a factory needs to build subclass instances, classmethod is the right tool.
Common mistake: writing a staticmethod that silently depends on class attributes. It should be a classmethod.
Version note: classmethod and staticmethod have been stable since Python 2.4; calling them as plain functions (e.g., classmethod(f)) before the decorator syntax works but is legacy.
0-2 years experience
2-5 years experience
5-8 years experience
8+ years experience