Back to Python Notes
Topic #237

Class Methods

By the end of this lesson, you will be able to define and use Python class methods to create alternative constructors that respect inheritance.

What it is

A class method is a method bound to the class itself rather than an instance. It receives the class as its first implicit argument, conventionally named cls. Unlike regular instance methods (which receive self) or static methods (which receive no implicit argument), class methods can access and modify class state that applies across all instances.

The mental model is simple: if an operation logically belongs to the "blueprint" of the object rather than a specific "house" built from that blueprint, it should likely be a class method. The most common use case is creating alternative ways to instantiate objects, known as factory methods.

Why it matters

  • Inheritance Safety: Class methods automatically pass the correct subclass to cls, ensuring that factory methods work correctly even when called on child classes.
  • Cleaner Code: They allow you to encapsulate complex initialization logic within the class definition, keeping your main code readable.
  • Alternative Constructors: Python only allows one __init__ method. Class methods provide a standard way to offer multiple entry points for object creation (e.g., from JSON, from a string, from a database row).
  • State Management: They can modify class-level variables, which is useful for tracking counts of created instances or managing shared resources.

Syntax or steps

To define a class method, use the @classmethod decorator immediately above the method definition inside a class. The first parameter must represent the class itself.

class MyClass:
    @classmethod
    def my_method(cls, arg1):
        # 'cls' refers to MyClass (or any subclass calling this)
        return cls(arg1)

Example

Consider a Date class that needs to be created from different formats. We will implement a standard constructor and a class method to parse a string.

class Date:
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    @classmethod
    def from_string(cls, date_str):
        """Create a Date instance from a 'YYYY-MM-DD' string."""
        parts = date_str.split('-')
        year = int(parts[0])
        month = int(parts[1])
        day = int(parts[2])
        return cls(year, month, day)

    def __repr__(self):
        return f"Date({self.year}, {self.month}, {self.day})"

# Usage
d1 = Date(2023, 10, 5)
d2 = Date.from_string("2024-01-15")

print(d1)
print(d2)

Explanation: 1. __init__ handles direct numeric input. 2. from_string is decorated with @classmethod. It takes cls instead of self. 3. Inside from_string, we parse the string into integers. 4. Crucially, we call return cls(...). If a subclass HolidayDate inherits from Date and calls HolidayDate.from_string(), cls will be HolidayDate, not Date. This ensures the returned object is of the correct type.

Common mistakes

  • Using self in a class method: You cannot access instance attributes via self because there is no instance yet. Always use cls.
  • Hardcoding the class name: Writing return Date(...) inside the method breaks inheritance. Always write return cls(...).
  • Confusing with Static Methods: Use @staticmethod if the method does not need access to the class or instance data at all. Use @classmethod if you need to instantiate the class or access class variables.
  • Forgetting the decorator: Without @classmethod, the first argument becomes just another positional parameter, leading to TypeErrors when calling the method.

When to use it

FeatureInstance MethodClass MethodStatic Method
First Argumentself (instance)cls (class)None
Access Instance DataYesNoNo
Access Class DataYesYesNo (unless hardcoded)
Primary Use CaseObject behaviorFactory/ConstructorsUtility functions

Use Class Methods when you need to create new instances or modify class state. Use Static Methods for helper functions that are logically related to the class but don't touch its data.

Practice

Guided Exercise: Create a class Temperature with an __init__ taking Celsius. Add a class method from_fahrenheit that converts F to C and returns a new Temperature instance.

Challenge: Modify the previous exercise so that from_fahrenheit also accepts an optional keyword argument precision (default 2) to round the result before returning.

Hint: Remember that cls(value) calls __init__. Ensure your conversion formula is (F - 32) * 5/9.

Quick check

Q: Why is using cls preferred over hardcoding the class name inside a class method?

A: Using cls ensures that if the method is inherited by a subclass, it creates an instance of that subclass, not the parent class. Hardcoding breaks polymorphism.

Summary

Class methods are essential for defining alternative constructors and managing class-level state in Python. By using the @classmethod decorator and the cls reference, you ensure your code remains robust and compatible with inheritance hierarchies.

Want to go beyond the notes?

Join Coding Now Tech Institute's Python course — live mentorship, real projects, and 100% placement support.

Enroll Now — Free Demo Available

Class Methods – FAQs

Quick answers about learning Class Methods in Python.

This free note from Coding Now Tech Institute explains Class Methods in Python — concept, syntax and worked code examples you can copy, run and revise before interviews.
Yes. Every Python topic on Coding Now Tech Institute, including Class Methods, is 100% free with no signup required.
With focused practice, most students grasp Class Methods in 1–3 days from these notes; pairing it with Coding Now Tech Institute's mentor-led course takes you to job-ready depth faster.
Use the code examples in this note, then ask doubts for free on the Coding Now Tech Institute Community (/community) — expert instructors answer within 24 hours.
Call NowEnroll Now