Skip to content Skip to sidebar Skip to footer

Calling Method, Classmethod, Staticmethod In The Same Python Class

From a famous example, I learned the difference between method, classmethod and staticmethod in a Python class. Source: What is the difference between @staticmethod and @classme

Solution 1:

Yes, your guesses will work. Note that it is also possible/normal to call staticmethods and classmethods outside the class:

class A():
    ...

A.class_foo()
A.static_foo()

Also note that inside regular instance methods, it's customary to call the staticmethods and class methods directly on the instance (self) rather than the class (A):

classA():definstance_method(self):
        self.class_foo()
        self.static_foo()

This allow for inheritance to work as you might expect -- If I create a B subclass from A, if I call B.instance_method(), my class_foo function will get B instead of A as the cls argument -- And possibly, if I override static_foo on B to do something slightly different than A.static_foo, this will allow the overridden version to be called as well.

Some examples might make this more clear:

classA(object):
    @staticmethoddefstatic():
        print("Static, in A")

    @staticmethoddefstaticoverride():
        print("Static, in A, overrideable")

    @classmethoddefclsmethod(cls):
        print("class, in A", cls)

    @classmethoddefclsmethodoverrideable(cls):
        print("class, in A, overridable", cls)

    definstance_method(self):
        self.static()
        self.staticoverride()
        self.clsmethod()
        self.clsmethodoverride()

classB(A):
    @classmethoddefclsmethodoverrideable(cls):
        print("class, in B, overridable", cls)

    @staticmethoddefstaticoverride():
        print("Static, in B, overrideable")


a = A()
b = B()
a.instance_method()
b.instance_method()

...

After you've run that, try it by changing all of the self. to A. inside instance_method. Rerun and compare. You'll see that all of the references to B have gone (even when you're calling b.instance_method()). This is why you want to use self rather than the class.

Solution 2:

As @wim said, what you have is right. Here's the output when My_Question is called.

>>> a.My_Question("My_Answer=D")
executing foo(<__main__.A object at 0x0000015790FF4668>,My_Answer=D)
executing class_foo(<class '__main__.A'>,My_Answer=D)
executing static_foo(My_Answer=D)

Post a Comment for "Calling Method, Classmethod, Staticmethod In The Same Python Class"