Class method differences in Python: bound, unbound and static

ghz 5months ago ⋅ 168 views

What is the difference between the following class methods?

Is it that one is static and the other is not?

class Test(object):
  def method_one(self):
    print "Called method_one"

  def method_two():
    print "Called method_two"

a_test = Test()
a_test.method_one()
a_test.method_two()

Answers

In Python, the main difference between method_one and method_two in your Test class is that method_one is an instance method, while method_two is intended to be a static method but is not defined correctly.

Let's break down the differences and correct the code:

Instance Method

method_one is defined with a self parameter, which is a reference to the instance of the class. This allows the method to access instance attributes and other methods:

class Test(object):
    def method_one(self):
        print("Called method_one")

# Example usage
a_test = Test()
a_test.method_one()  # This works

When you call a_test.method_one(), Python automatically passes the instance (a_test) as the first argument to method_one.

Static Method

method_two is defined without a self parameter. To be recognized as a static method, it should be decorated with @staticmethod. Static methods do not receive an implicit first argument (like self) and cannot access or modify the instance or class state:

class Test(object):
    def method_one(self):
        print("Called method_one")

    @staticmethod
    def method_two():
        print("Called method_two")

# Example usage
a_test = Test()
a_test.method_one()  # This works
a_test.method_two()  # This works

# You can also call it on the class itself
Test.method_two()    # This also works

Summary of the Differences

  • Instance Method (method_one):

    • Receives the instance (self) as the first argument.
    • Can access and modify the instance's attributes and call other instance methods.
    • Can be called on an instance of the class.
  • Static Method (method_two):

    • Does not receive an implicit first argument (no self).
    • Cannot access or modify instance or class attributes unless they are passed explicitly.
    • Can be called on an instance or directly on the class.

Corrected Code

Here's your class with both methods correctly defined:

class Test(object):
    def method_one(self):
        print("Called method_one")

    @staticmethod
    def method_two():
        print("Called method_two")

# Example usage
a_test = Test()
a_test.method_one()  # Calls the instance method
a_test.method_two()  # Calls the static method

# Static method can also be called directly on the class
Test.method_two()    # Calls the static method

In this corrected code, method_two is decorated with @staticmethod, making it a proper static method.