Instance method vs. Static method vs. Class method in Python
In a python class, there are three kinds of methods:
- Instance method
- Static method
- Class method
Example explained
Look at the following code, have a test for yourself, what are the output:
class Foo(object):variable = 1 def method(self, param): print "run instance method (%s,%s)" % (self, param) @classmethod def class_method1(cls, param): print "run class method (%s,%s)" % (cls, param) @classmethod def class_method2(cls): print cls.variable @staticmethod def static_method1(param): print "run static method (%s)" % param @staticmethod def static_method2(): print variablefoo = Foo()
foo.method(“instance method”) #Foo.method(“instance method again”)
foo.class_method1(“class method 1”) foo.class_method2() Foo.class_method1(“class method 1 again”) Foo.class_method2()
foo.static_method1(“static method 1”) foo.static_method2() Foo.static_method1(“static method 1 again”) Foo.static_method2()
https://gist.github.com/arkilis/341bf667a577b04b8b3a58bce78809a6
Results:
1: foo.method("instance method") — OK
2: Foo.method("instance method again") is wrong, as method is the instance method. To run an instance method, you have to use a class instance
3: foo.class_method1("class method 1") outputs run class method (<class '__main__.Foo'>,class method 1)
4: foo.class_method2() outputs 1
5: Foo.class_method1("class method 1 again") outpus run class method (<class '__main__.Foo'>,class method 1 again)
6: Foo.class_method2() outputs 1
7: foo.static_method1("static method 1") outputs run static method (static method 1)
8: foo.static_method2() is wrong, as static_method2 is static method, which cannot access the instance level variable
9: Foo.static_method1("static method 1 again") outputs run static method (static method 1 again)
10: Foo.static_method2() is wrong, which cannot access the class level variable
Conclusion
- instance method (i.e.
method()) must be called by a class instance - class method can be called either by a class instance or class itself
- static method is quite special in Python, as it is also can be called by a class instance or class itself
- the only difference between a static method and a class method, class method can access the class’s variable that static can’t