classmethod()
The built-in classmethod() function is a decorator that transforms a method into a class method. A class method receives the class itself as its first argument, enabling it to access or modify class-level data rather than instance data. This functionality is particularly useful for creating multiple constructors, which allow for different ways to instantiate the class:
margherita.py
class Pizza:
def __init__(self, ingredients):
self.ingredients = ingredients
@classmethod
def margherita(cls):
return cls(["mozzarella", "tomatoes"])
def __str__(self):
return f"Pizza with {' and '.join(self.ingredients)}"
# Usage
print(Pizza.margherita()) # Output: Pizza with mozzarella and tomatoes
classmethod() Syntax
@classmethod
def method(cls, *args, **kwargs):
...
Arguments
| Argument | Description |
|---|---|
method |
A method to be converted into a class method. |
Return Value
- Returns a class method object that can be called on both the class and its instances.
classmethod() Examples
As an alternative constructor:
point.py
class ThreeDPoint:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
@classmethod
def from_sequence(cls, sequence):
return cls(*sequence)
def __repr__(self):
return f"ThreeDPoint(x={self.x}, y={self.y}, z={self.z})"
# Usage
print(
ThreeDPoint.from_sequence((4, 8, 16))
) # Output: ThreeDPoint(x=4, y=8, z=16)
classmethod() Common Use Cases
The most common use cases for the @classmethod include:
- Creating multiple constructors for flexibility in instantiation.
- Implementing factory methods to encapsulate complex object creation logic.
- Modifying class-level attributes that apply to all instances.
classmethod() Real-World Example
A common real-world application of @classmethod is to create factory methods that return pre-configured instances of a class. For example, a Pizza class might have class methods for creating specific types of pizza:
pizzas.py
class Pizza:
def __init__(self, ingredients):
self.ingredients = ingredients
@classmethod
def margherita(cls):
return cls(["mozzarella", "tomatoes"])
@classmethod
def prosciutto(cls):
return cls(["mozzarella", "tomatoes", "ham"])
def __str__(self):
return f"Pizza with {' and '.join(self.ingredients)}"
# Usage
print(
Pizza.margherita()
) # Output: Pizza with mozzarella and tomatoes
print(
Pizza.prosciutto()
) # Output: Pizza with mozzarella and tomatoes and ham
This approach simplifies the creation of Pizza objects by providing predefined configurations.