Python staticmethod()

The staticmethod() built-in function returns a static method for a given function.

Example

class Calculator:

  def add_numbers(num1, num2):
    return num1 + num2

# convert add_numbers() to static method Calculator.add_numbers = staticmethod(Calculator.add_numbers)
sum = Calculator.add_numbers(5, 7) print('Sum:', sum) # Output: Sum: 12

staticmethod() Syntax

The syntax of staticmethod() is:

staticmethod(function)

Note: staticmethod() is considered a un-Pythonic way of creating a static function. Hence, in newer versions of Python, you can use the @staticmethod decorator.

Syntax of @staticmethod is:

@staticmethod
def func(args, ...)

staticmethod() Parameters

The staticmethod() method takes a single parameter:

  • function - function that needs to be converted to a static method

staticmethod() Return Type

The staticmethod() returns a static method for a function passed as the parameter.


What is a static method?

Static methods, much like class methods, are methods that are bound to a class rather than its object.

They do not require a class instance creation. So, they are not dependent on the state of the object.

The difference between a static method and a class method is:

  • Static method knows nothing about the class and just deals with the parameters.
  • Class method works with the class since its parameter is always the class itself.

They can be called both by the class and its object.

Class.staticmethodFunc()
or even
Class().staticmethodFunc()

Example 1: Create a static method using staticmethod()

class Mathematics:

    def addNumbers(x, y):
        return x + y

# create addNumbers static method Mathematics.addNumbers = staticmethod(Mathematics.addNumbers)
print('The sum is:', Mathematics.addNumbers(5, 10))

Output

The sum is: 15

When do you use static methods?

1. Grouping utility function to a class

Static methods have a limited use case because, like class methods or any other methods within a class, they cannot access the properties of the class itself.

However, when you need a utility function that doesn't access any properties of a class but makes sense that it belongs to the class, we use static functions.

Example 2: Create a utility function as a static method

class Dates:
    def __init__(self, date):
        self.date = date
        
    def getDate(self):
        return self.date

@staticmethod def toDashDate(date): return date.replace("/", "-")
date = Dates("15-12-2016") dateFromDB = "15/12/2016" dateWithDash = Dates.toDashDate(dateFromDB) if(date.getDate() == dateWithDash): print("Equal") else: print("Unequal")

Output

Equal

Here, we have a Dates class that only works with dates with dashes. However, in our previous database, all dates were present in slashes.

In order to convert the slash-dates to dash-dates, we have created a utility function toDashDate within Dates.

It is a static method because it doesn't need to access any properties of Dates itself and only requires the parameters.

We can also create toDashDate outside the class, but since it works only for dates, it's logical to keep it inside the Dates class.


2. Having a single implementation

Static methods are used when we don't want subclasses of a class change/override a specific implementation of a method.

Example 3: How inheritance works with static method?

class Dates:
    def __init__(self, date):
        self.date = date
        
    def getDate(self):
        return self.date

@staticmethod def toDashDate(date): return date.replace("/", "-")
class DatesWithSlashes(Dates): def getDate(self): return Dates.toDashDate(self.date) date = Dates("15-12-2016") dateFromDB = DatesWithSlashes("15/12/2016") if(date.getDate() == dateFromDB.getDate()): print("Equal") else: print("Unequal")

Output

Equal

Here, we wouldn't want the subclass DatesWithSlashes to override the static utility method toDashDate because it only has a single use, i.e. change date to dash-dates.

We could easily use the static method to our advantage by overriding getDate() method in the subclass so that it works well with the DatesWithSlashes class.

Did you find this article helpful?