Class methods

Class methods are methods that are bound to the class rather than an instance of the class. They are defined using the @classmethod decorator and can be called on both the class itself and its instances. Class methods have access to the class itself and can modify class-level attributes or perform operations related to the class.

Let's take an example of a MathUtils class to understand how class methods work:

class MathUtils:
    PI = 3.14159

    @classmethod
    def circle_area(cls, radius):
        return cls.PI * radius**2

    @classmethod
    def circle_circumference(cls, radius):
        return 2 * cls.PI * radius

In this code, we define a MathUtils class with two class methods: circle_area and circle_circumference. These methods perform calculations related to circles and use the class-level attribute PI.

To use the class methods, we can call them directly on the class itself or on an instance of the class:

print(MathUtils.circle_area(5))  # Output: 78.53975
print(MathUtils.circle_circumference(5))  # Output: 31.4159

math_obj = MathUtils()
print(math_obj.circle_area(3))  # Output: 28.27431
print(math_obj.circle_circumference(3))  # Output: 18.84954

In this code, we call the circle_area and circle_circumference class methods both on the MathUtils class itself and on an instance of the class (math_obj). The class methods have access to the class-level attribute PI and perform calculations based on the provided radius.

Class methods are useful when you need to perform operations that are related to the class as a whole, rather than specific instances. They can be used to modify class-level attributes, perform calculations, or implement class-specific functionality.

It's important to note that class methods have access to the class itself through the cls parameter, which is automatically passed as the first argument. By convention, the first parameter of a class method is named cls, but you can use any valid parameter name.