Implementing Static Methods
Credit: Alex Martelli, Carel Fellinger
Problem
You want to call methods directly on a class without supplying an instance of the class as the first argument, or on any instance without having the instance implicitly become the first argument.
Solution
In Python 2.2 (on either classic or new-style classes), the new
built-in
staticmethod
function wraps any callable into a static method, and we just bind
the same name to the staticmethod object in class
scope:
class Greeter:
def greet(name): print "Hello", name
greet = staticmethod(greet)In Python 2.1 and earlier, we can easily simulate the same construct:
class staticmethod:
def _ _init_ _(self, anycallable): self._ _call_ _ = anycallableNow, with any release of Python, we can say:
>>> greeting = Greeter( )
>>> greeting.greet("Peter")
Hello Peter
>>> Greeter.greet("Paul")
Hello PaulYou can get a static method as a class attribute or as the attribute of any instance of the class. It does not matter which, because when you call the static method, it calls the underlying callable anyway.
Discussion
In Python, when you want to make a function available for calling, you normally expose it as an attribute of a module, not of a class. An attribute of a class object that starts out as a Python function implicitly mutates into an unbound method (see Recipe 5.13 for a way to exploit this). Thus, if you want to make the function available as a class attribute, without mutation, you need to wrap the function into a callable ...