in Technology by
What are the Difference between staticmethod and classmethod in Python?

1 Answer

0 votes
by
Maybe a bit of example code will help: Notice the difference in the call signatures of foo, class_foo and static_foo: class A(object): def foo(self, x): print "executing foo(%s, %s)" % (self, x) @classmethod def class_foo(cls, x): print "executing class_foo(%s, %s)" % (cls, x) @staticmethod def static_foo(x): print "executing static_foo(%s)" % x a = A() Below is the usual way an object instance calls a method. The object instance, a, is implicitly passed as the first argument. a.foo(1) # executing foo(<__main__.A object at 0xb7dbef0c>,1) With classmethods, the class of the object instance is implicitly passed as the first argument instead of self. a.class_foo(1) # executing class_foo(,1) You can also call class_foo using the class. In fact, if you define something to be a classmethod, it is probably because you intend to call it from the class rather than from a class instance. A.foo(1) would have raised a TypeError, but A.class_foo(1) works just fine: A.class_foo(1) # executing class_foo(,1) With staticmethods, neither self (the object instance) nor cls (the class) is implicitly passed as the first argument. They behave like plain functions except that you can call them from an instance or the class: a.static_foo(1) # executing static_foo(1) A.static_foo('hi') # executing static_foo(hi) Staticmethods are used to group functions which have some logical connection with a class to the class. foo is just a function, but when you call a.foo you don't just get the function, you get a "partially applied" version of the function with the object instance a bound as the first argument to the function. foo expects 2 arguments, while a.foo only expects 1 argument. a is bound to foo. That is what is meant by the term "bound" below: print(a.foo) # > With a.class_foo, a is not bound to class_foo, rather the class A is bound to class_foo. print(a.class_foo) # > Here, with a staticmethod, even though it is a method, a.static_foo just returns a good 'ole function with no arguments bound. static_foo expects 1 argument, and a.static_foo expects 1 argument too. print(a.static_foo) # And of course the same thing happens when you call static_foo with the class A instead. print(A.static_foo) #

Related questions

0 votes
    What is the difference between Python Arrays and lists?...
asked Dec 7, 2020 in Technology by JackTerrance
0 votes
    What is the difference between xrange and range in Python?...
asked Dec 6, 2020 in Technology by JackTerrance
0 votes
    What is the difference between tuples and lists in Python?...
asked Nov 23, 2020 in Technology by JackTerrance
0 votes
    Apparently xrange is faster but I have no idea why it's faster (and no proof besides the anecdotal so far that it ... xrange(0, 20): Select the correct answer from above options...
asked Jan 27, 2022 in Education by JackTerrance
0 votes
    I have a dataframe that looks like this: from to datetime other ---------------------------------- ... !! Thank you so much in advance! Select the correct answer from above options...
asked Feb 1, 2022 in Education by JackTerrance
0 votes
    What are the difference between Task and Thread in .NET?...
asked Feb 16, 2023 in Technology by JackTerrance
0 votes
    What are the difference between JBehave and Cucumber?...
asked Jul 22, 2021 in Technology by JackTerrance
0 votes
    What are the Difference between TDD and BDD?...
asked Jul 20, 2021 in Technology by JackTerrance
0 votes
    What are the difference between dollar message and $$message....
asked Jul 13, 2021 in Technology by JackTerrance
0 votes
    What are the types of Schemas we have in data warehouse and what are the difference between them?...
asked Mar 29, 2021 in Technology by JackTerrance
0 votes
    What are lists and tuples? What is the key difference between the two?...
asked Dec 6, 2020 in Technology by JackTerrance
0 votes
    what are the difference between Selenium 2.0 different from Selenium 3.0?...
asked May 19, 2021 in Technology by JackTerrance
0 votes
    What are difference between Margin v/s Padding?...
asked Dec 21, 2020 in Technology by JackTerrance
0 votes
    What is the difference between multimolecular and macromolecular collids ? Give one example of each . How are ... colloids ? Select the correct answer from above options...
asked Jan 3, 2022 in Education by JackTerrance
0 votes
    What are the wrapper classes ? What is the difference between scanner class and wrapper class ? 100 points . Select the correct answer from above options...
asked Dec 28, 2021 in Education by JackTerrance
...