classmethodmust have a reference to a class object as the first parameter, whereas
staticmethodcan have no parameters at all.
classmethodare for when you need to have methods that aren’t specific to any particular instance, but still involve the class in some way. The most interesting thing about them is that they can be overridden by subclasses. Factory methods (alternative constructors) are indeed a classic example of class methods.
If you have a class MyClass, and a module-level function that operates on
MyClass(factory, dependency injection stub, etc), make it a
Here is some code example:
class Date(object): day = 0 month = 0 year = 0 def __init__(self, day=0, month=0, year=0): self.day = day self.month = month self.year = year @staticmethod def is_date_valid(date_as_string): day, month, year = map(int, date_as_string.split('-')) return day <= 31 and month <= 12 and year <= 3999 @classmethod def from_string(cls, date_as_string): day, month, year = map(int, date_as_string.split('-')) date1 = cls(day, month, year) return date1 day, month, year = map(int, string_date.split('-')) date1 = Date(day, month, year) date2 = Date.from_string('11-09-2012') if is_date_valid('11-09-2012'): print 'Valid Day!'
Pay attention to
cls parameter in the example above;
cls is an object that holds
class itself, not an instance of the class. It’s pretty cool because if we inherit our
Date class, all children will have from_string defined also.
staticmethoddoesn’t have any access to what the class is- it’s basically just a function, called syntactically like a method, but without access to the object and it’s internals (fields and another methods), while
staticmethod is similar to C++ or Java’s static methods, which can be called
without creating an instance of a class.