In the previous lesson, we covered @classmethod.
In this tutorial, we will focus on @staticmethod and understand its role in Python. Static methods do not operate on an instance or the class itself, making them useful for utility functions that logically belong to a class but do not need access to instance or class attributes.
1. Regular Methods: Attached to the Class
Regular methods are glued to the class or its instances. Check this out:
class Car:
def __init__(self, model):
self.model = model
def describe(self): # Regular method
return f"This is a {self.model}"
# Using it
my_car = Car("Toyota")
description = my_car.describe() # This is a Toyota
Flow and Connection:
- describe needs self — it’s attached to the instance (my_car). It grabs self.model to build the string.
- Without an instance, this doesn’t work — you can’t call Car.describe() directly. It’s tied to the object’s state.
2. Static Methods vs. Standalone Functions
Now, let’s meet @staticmethod. It lives in the class but doesn’t need its data. To prove it’s not truly “attached,” I’ll pair it with an identical standalone function:
# Standalone function
def honk_sound():
return "Beep beep!"
class Car:
def __init__(self, model):
self.model = model
def describe(self):
return f"This is a {self.model}"
@staticmethod
def honk_sound(): # Static method
return "Beep beep!"
# Using both
standalone_result = honk_sound() # Beep beep!
static_result = Car.honk_sound() # Beep beep!
car_instance = Car("Toyota")
instance_result = car_instance.honk_sound() # Beep beep!
Flow and Comparison:
- Standalone honk_sound: A plain function, not tied to any class. Call it anywhere with honk_sound(), and it returns “Beep beep!” — no Car needed.
- Static honk_sound: Lives inside Car, called with Car.honk_sound() or even car_instance.honk_sound(). It still returns “Beep beep!” but doesn’t use self or any Car data.
- Key Point: Both do the exact same thing. The static version isn’t attached to the class’s state — it’s just parked there. The Car. prefix is Python’s way of organizing it, not a sign of dependency.
3. Practical Example: Numbers, No Class Strings Attached
Let’s try a number-based example. Regular methods use class data; static methods and standalone functions don’t:
# Standalone function
def square(n):
return n * n
class NumberCruncher:
def __init__(self, offset):
self.offset = offset
def add_offset(self, x): # Regular method
return x + self.offset
@staticmethod
def square(n): # Static method
return n * n
# Using them
cruncher = NumberCruncher(3)
offset_result = cruncher.add_offset(5) # 8 (5 + 3)
static_result = NumberCruncher.square(4) # 16 (4 * 4)
standalone_result = square(4) # 16 (4 * 4)
Flow and Comparison:
- add_offset: Needs self.offset (3), so it’s attached — adds 3 to 5, giving 8.
- square (static): Takes n (4), returns 4 * 4 = 16. No self, no class data — just pure math.
- square (standalone): Same as the static version, called without a class. Both are identical in behavior.
- Difference: add_offset relies on the instance’s offset, while both squares are free of NumberCruncher’s state.
4. Another example
Here’s a practical case — cleaning text. Watch how the static method mirrors a standalone function:
# Standalone function
def strip_spaces(text):
return text.replace(" ", "")
class TextCleaner:
def __init__(self, signature):
self.signature = signature
def sign(self, text): # Regular method
return f"{text} - {self.signature}"
@staticmethod
def strip_spaces(text): # Static method
return text.replace(" ", "")
# Using them
cleaner = TextCleaner("ByMe")
signed = cleaner.sign("Hello World") # Hello World - ByMe
static_clean = TextCleaner.strip_spaces("Hi There") # HiThere
standalone_clean = strip_spaces("Hi There") # HiThere
Flow and Comparison:
- sign: Uses self.signature to append “ByMe” — it’s attached to the instance.
- strip_spaces (static): Takes text, removes spaces, returns “HiThere”. No self, no class connection.
- strip_spaces (standalone): Does the same, called directly. Both are interchangeable.
- Difference: sign needs the instance’s signature, while strip_spaces doesn’t care about TextCleaner.
5. So, Why @staticmethod?
- Regular Methods: Attached — use them when you need instance data (self) or class data (via @classmethod with cls).
- Static Methods: Not attached — use them for utilities that don’t need class state. They’re like standalone functions, just stored in the class for organization.
Why ClassName.method() Then? Python sticks static methods in the class’s namespace. You could write them as standalone functions, but grouping them (e.g., TextCleaner.strip_spaces) keeps your code tidy and related tools together.